2012-10-20 74 views
5

我在使用帶有JPA的ObjectDB。我想打電話給myMethod()。例如:JPA中的調用方法

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; 
    } 
} 
+0

嘗試:'... MyClass的數據data.x * 1000 = 100 - data.y'查詢。 –

+0

不,這只是一個示例方法。事實上,我有其他更復雜的方法。但是如果我能夠調用myMethod(),所有問題都將被解決。 – Martynas

回答

5

JPQL不完全是基於對象的查詢語言。你不能定義你自己的方法,並且JPQL提供了一組非常有限的函數。所以如果你想保持在JPA規範內,那麼答案是否定的;必須是JPA實現特定的 - DataNucleus JPA當然允許你在查詢語言中擁有自己的方法(作爲一個供應商擴展),不知道你引用的JPA提供者 - 儘管如此,它只會執行這樣的查詢在數據存儲區中如果您將該方法的代碼放入查詢方法實現中(而不是在類中)

0

不是你要找的方式。如果您想使用自定義方法,則可以在使用它們之前創建並註冊它們。

例如下面創建一個函數:

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

然後註冊使用registerFunction()與數據庫的dialect此功能。一旦完成,你可以寫一個查詢爲:

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

鋤頭這有助於。

+0

這顯然是Hibernate特有的,OP沒有提到Hibernate – DataNucleus

0

不,你不能那樣做。由於JPA總是準備語句(參數SQL)的作品,你可以像

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

WHERE子句JPQL查詢的唯一一套參數製作方法(myMethod())不知何故返回值和替換它的第二個參數setParameter()方法的parameterValue由您的方法返回的值,myMethod()

0

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