2012-10-20 22 views
5

Sto usando ObjectDB con JPA. Vorrei chiamare myMethod(). Ad esempio:Metodo di chiamata in JPA

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

È possibile? Forse è necessaria un'annotazione prima del metodo in classe?

@Entity 
public class MyClass implements Serializable { 

    @Basic 
    private int x; 

    @Basic 
    private int y; 

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

Prova: '... MyClass dati data.x * 1000 = 100 - data.y' nella query. –

+0

No. È solo un metodo di esempio. In effetti ho un altro metodo che è più complicato. Ma se potessi chiamare myMethod() tutti i problemi saranno risolti. – Martynas

risposta

5

JPQL non è esattamente un linguaggio di query basato su oggetti. Non è possibile definire i propri metodi e JPQL fornisce un insieme molto limitato di funzioni. Quindi, se si desidera mantenere le specifiche JPA, la risposta è no; dovrebbe essere specifico per l'implementazione di JPA - DataNucleus JPA ti consente certamente di avere i tuoi metodi nel linguaggio di query (come estensione di un venditore), non ha idea del tuo provider JPA quotato, ma ha detto che eseguirà solo una query nel datastore se si inserisce il codice per tale metodo in un'implementazione del metodo di query (a differenza della classe)

0

Non è il modo che stai cercando. Se si desidera utilizzare un metodo personalizzato, è possibile creare e registrarli prima di utilizzarli.

ad es. creare una funzione, come di seguito:

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

quindi registrare questa funzione utilizzando registerFunction() con l'dialect del database. Una volta fatto, è possibile scrivere una query come:

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

Hoe questo aiuta.

+0

Che è chiaramente specifico di Hibernate e l'OP non menziona Hibernate – DataNucleus

0

No, non puoi farlo. Dal momento che JPA lavora sempre con istruzione preparata (SQL con parametri), si può solo i parametri impostati nella clausola WHERE della query JPQL come

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

rendere il metodo (myMethod()) restituiscono il valore in qualche modo e sostituire il secondo parametro che è parameterValue del metodo setParameter() in base al valore restituito dal metodo, myMethod().

0

JPQL viene tradotto in SQL, quindi non è possibile includere una chiamata al metodo Java come database (molto probabilmente) non supporta Java.

In JPA 2.1 sarà possibile utilizzare l'operatore FUNCTION per chiamare le funzioni di "database". Alcuni database supportano la definizione di funzioni in Java, ma normalmente viene utilizzato un linguaggio di database proprietario (come PL/SQL).

EclipseLink supporta entrambi gli operatori FUNC e FUNCTION per chiamare le funzioni del database. È anche possibile definire i propri operatori utilizzando l'operatore OPERATOR che consente di definire la propria chiamata di funzione del database personalizzato in Java.

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

Problemi correlati