2016-01-03 50 views
0

我建立了一個簡單的Query返回通過的可能性列表搜索的@Embeddable領域的結果列表。查詢是:JPA其中嵌入優化(休眠和PostgreSQL)

select d from data d where embedField in :embedValues 

它工作正常,但與Hibernate和PostgreSQL發行到SQL Server所產生的本地查詢是這樣的:

select * from data where 
    f1=$1 and f2=$2 
    or 
    f1=$3 and f2=$4 
    or 
    f1=$5 and f2=$6 

我本來期望在本地查詢更高效,例如,

select * from data where (f1,f2) in (($1,$2),($3,$4),($5,$6)) 

我寫了namedQuery因爲我想更好的表現,但我不認爲我會與正在執行的查詢得到它。有沒有更好的方式來更容易地獲得更好的原生查詢?

爲了完整起見,我添加了一些說明性的類。

@Embeddable class Embed { 
    int f1; 
    int f2; 
    public Embed(int i, int j) {f1 = i; f2 = j;} 
} 

@Entity class Datum { 
    @Embedded Embed embedField; 
} 

class Test { 
    public static void main(String... args) { 
    new Test().run(); 
    } 
    public void run() { 
    EntityManger em = ... 
    List<Datum> data = em.createQuery("select d from Data d where embedField in $1") 
     .setParameter(1, Arrays.asList(new Embed(1,2),new Embed(3,4),new Embed(5,6))) 
     .getResultList(); 
    } 
} 

感謝您的任何幫助,讚賞。

回答

1

嗯,我在一個字符串,做了什麼,我想,如上所述寫了一本機查詢,但它給了絕對沒有性能優勢。我可以很好地想象到,當SQL服務器將查詢轉換爲執行計劃時,它無論如何都是相同的結果,因此沒有區別。所以,答案是,不,沒有更好的方法來編寫JQPL查詢,這樣可以。