14

私はJPAでObjectDBを使用しています。myMethod()を呼び出したいと思います。例えば:

entityManager.createQuery("SELECT ... FROM ... WHERE MyClass.myMethod() = 100")

出来ますか?クラスのメソッドの前にアノテーションが必要なのかもしれません。

@Entity
public class MyClass implements Serializable {

    @Basic 
    private int x;

    @Basic
    private int y;

    public int myMethod() {
        return x*1000+y;
    }
}
4

5 に答える 5

5

JPQLは、正確にはオブジェクトベースのクエリ言語ではありません。独自のメソッドを定義することはできません。JPQLが提供する関数のセットは非常に限られています。したがって、JPA仕様の範囲内に収めたい場合、答えはノーです。JPA実装固有である必要があります-DataNucleusJPAを使用すると、(ベンダー拡張として)クエリ言語で独自のメソッドを使用できます。引用符で囲まれたJPAプロバイダーについてはわかりませんが、このようなクエリそのメソッドのコードを(クラスではなく)クエリメソッドの実装に配置した場合のデータストア

于 2012-10-21T10:22:14.633 に答える
3

はい、できます!また、追加の注釈は必要ありません。

ObjectDBは、オブジェクト指向データベースシステム(OODBS)の実装であり、その結果、メソッドの呼び出し、継承やポリモーフィズムの使用など、データベースアイテムをオブジェクトとして操作できます。

これは私が持っている簡単な実例です。このようなクラスの場合:

@Entity
public class Person {
    private static final long serialVersionUID = 1L;

    @Id @GeneratedValue
    private long id;

    private String firstName;
    private String lastName;

    Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFullName() {
        return firstName + " " + lastName;
    }
}

このクエリは正しい結果を返します。

entityManager.createQuery(
    "SELECT p FROM Person p WHERE p.getFullName()='John Johnson'", Person.class).getResultList();
于 2019-01-04T22:44:23.847 に答える
1

JPQLはSQLに変換されるため、データベースは(ほとんどの場合)Javaをサポートしていないため、Javaメソッド呼び出しを含めることはできません。

JPA 2.1では、FUNCTION演算子を使用して「データベース」関数を呼び出すことができます。一部のデータベースはJavaでの関数の定義をサポートしていますが、通常は独自のデータベース言語(PL / SQLなど)が使用されます。

EclipseLinkは、データベース関数を呼び出すためのFUNC演算子とFUNCTION演算子の両方をサポートしています。OPERATOR演算子を使用して独自の演算子を定義することもできます。これにより、Javaで独自のカスタムデータベース関数呼び出しを定義できます。

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#EclipseLink_special_operators

于 2012-10-22T14:49:20.167 に答える
-1

あなたが探している方法ではありません。カスタムメソッドを使用する場合は、使用する前に作成して登録できます。

たとえば、次のように関数を作成します。

        public int myMethod(int x, int y){
           return x*1000+y;
        }

registerFunction()次に、データベースのを使用してこの関数を登録しdialectます。完了したら、次のようにクエリを記述できます。

  from MyClass data where myMethod(data.x, data.y) =100;

Hoeこれは役立ちます。

于 2012-10-21T00:02:10.060 に答える
-1

いいえ、それはできません。WHEREJPAは常にプリペアドステートメント(パラメーター化されたSQL)で機能するため、JPQLクエリの句でパラメーターを設定できるのは次のようになります。

entityManager.createQuery("SELECT .... FROM ... WHERE  
someCondition=:someValue).setParameter("someValue", "parameterValue");

メソッド( )が何らかの方法でその値を返すようにし、メソッドの2番目のパラメーターをメソッドによって返される値にmyMethod()置き換えます。parameterValuesetParameter()myMethod()

于 2012-10-21T00:40:30.183 に答える