2012-10-20 22 views
5

JPA ile ObjectDB kullanıyorum. MyMethod() öğesini aramak istiyorum. Örneğin:JPA içinde çağırma yöntemi

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

Mümkün mü? Belki de sınıftaki yöntemden önce herhangi bir ek açıklama gerekir?

@Entity 
public class MyClass implements Serializable { 

    @Basic 
    private int x; 

    @Basic 
    private int y; 

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

Dene: '... sınıfla veri data.x * 1000 = 100 - data.y' sorguda. –

+0

Hayır. Bu sadece bir örnek yöntemdir. Gerçekten daha karmaşık olan başka bir yöntem var. Ama eğer myMethod() 'ı arayabilirsem, bütün problemler çözülecek. – Martynas

cevap

5

JPQL tam olarak nesne tabanlı bir sorgu dili değildir. Kendi yöntemlerinizi tanımlayamazsınız ve JPQL çok sınırlı bir işlev kümesi sağlar. Dolayısıyla, JPA spesifikasyonunda kalmak istiyorsanız, cevap hayır demektir; JPA uygulama özel olması gerekir - DataNucleus JPA sorgulama dilinde (satıcı uzantı olarak) kendi yöntemlerinizi almanıza izin verir, teklif edilen JPA sağlayıcınız hakkında hiçbir fikriniz olmasa da, sadece böyle bir sorguyu yürütür Veritabanındaki bir sorgu yöntemi uygulamasında (sınıfın aksine) bu yöntemin kodunu koyarsanız

0

Aradığınız yolu değil. Özel yöntem kullanmak isterseniz, bunları kullanmadan önce oluşturabilir ve kaydedebilirsiniz.

örn. aşağıdaki gibi bir işlev oluşturun:

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

Sonra veritabanının dialect ile registerFunction() kullanarak bu işlevi kayıt. Tamamlandığında, aşağıdaki gibi bir sorgu yazabilirsiniz:

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

Bu yardımcı olur.

+0

Net olarak hazırda bekletme özelliğine sahip olan OP, Hibernate'den söz etmiyor – DataNucleus

0

Hayır bunu yapamazsınız. JPA hep hazırlanmış deyimi (parametreli SQL) ile çalışır olduğundan,

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

gibi JPQL sorgusunun WHERE yan tümcesinde sadece set parametreler yöntemi (myMethod()) Make her nasılsa o değer döndürmek ve ikinci parametreyi değiştirebilirsiniz Metoken tarafından döndürülen değere göre setParameter() yönteminin parameterValue, myMethod().

0

JPQL SQL'e dönüştürülür, bu nedenle veritabanınız olarak bir Java yöntemi çağrısı dahil edemezsiniz) Java'yı desteklemiyor.

JPA 2.1'de "veritabanı" işlevlerini çağırmak için FUNCTION operatörünü kullanabilirsiniz. Bazı veritabanı, Java'da tanımlayıcı işlevleri desteklemektedir, ancak normal olarak özel bir veritabanı dili (PL/SQL gibi) kullanılır.

EclipseLink, veritabanı işlevlerini çağırmak için FUNC ve FUNCTION işleçlerini destekler. Kendi operatörlerinizi, Java'da kendi özel veritabanı işlev çağrınızı tanımlamanıza izin veren OPERATOR operatörünü kullanarak da tanımlayabilirsiniz.

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