2014-04-23 127 views
0

我在使用JPA查詢時遇到了一些麻煩。我現在應該告訴你,我根本不是JPA的專家。JPA select entity and use subquery to assign value in entity all in one query

我有兩個類,LineLineData

LineLineData之間的關係是,一條線可能有100個與之關聯的對象LineData。我沒有明確加入他們的原因是因爲大部分時間我檢索Line實體時,我不需要LineData(並且看到可能有100個,因此加載它們然後不是使用它們)。

不過,我想怎樣能夠做到,檢索Line實體時,是得到最大LineData.value1價值,以及和返回,作爲Line實體的一部分,作爲Line.maxVal1。我試着用下面的查詢這樣做:

SELECT l, l.maxVal1 = (SELECT MAX(d.value1) FROM LineData d WHERE d.name = l.name) 
FROM Line l 
WHERE l.name = example123 
ORDER BY l.name ASC 

Line.maxVal1是回來爲null。我已經嘗試了它自己的子查詢,它確實返回實際值。是否可以做我在這裏嘗試的?如果是這樣,怎麼樣?

這裏是我班的簡化版本:

public class Line { 
    @Column(nullable = false, unique = true) 
    public String name; 

    @Column 
    public boolean active; 

    @Transient 
    public Integer maxVal1; 
} 

public class LineData { 
    @Column(nullable = false) 
    public String name; 
    @Column 
    public Integer value1; 
    @Column 
    public Integer value2; 
    @Column 
    public Integer value3; 
    ... 
    @Column 
    public Integer activeN; 
} 

編輯 這裏的一個例子是什麼數據庫值將如下所示:

Line 
name  | active 
====================== 
example123 | true 
example234 | false 
example345 | true 

LineData 
name  | value1 | value2 | ... | valueN 
============================================ 
example123 | 1  | 2  |  | 1 
example123 | 3  | 2  |  | 1 
example345 | 1  | 2  |  | 1 
example123 | 14  | 2  |  | 1 
example123 | 2  | 2  |  | 1 
example123 | 2  | 2  |  | 1 
example123 | 3  | 2  |  | 1 

和查詢的結果返回一個線對象,其值爲:

name  | active | maxVal1 
============================== 
example123 | true | 14 
+0

你嘗試'選擇L,(SELECT MAX(d.value1)...)爲L。 maxVal1 .....'? – Mubin

+0

@Mubin我嘗試過,但我得到一個IllegalArgumentException,因爲它不喜歡''.'在'l.maxVal1' – gordon

+0

我沒有一個環境設置測試,你可以看到如果你得到的值如果您使用如下查詢:'SELECT l.name,(SELECT MAX(d.value1)...)AS l.maxVal1 FROM Line l .....' – Mubin

回答

0

如果使用休眠你可以嘗試@Formula

public class Line { 
    @Column(nullable = false, unique = true) 
    public String name; 

    @Column 
    public boolean active; 

    @Formula("(SELECT MAX(d.value1) FROM LineData d WHERE d.name = name)") 
    public Integer maxVal1; 
} 

@Formula包含本地SQL - 沒有HQL

+0

我試過這個,但我仍然有一個錯誤。無論哪種方式,我寧願不使用本機SQL。 – gordon

+0

請問,當我想到另一個解決方案時,你能發佈錯誤嗎? – drkunibar