2017-07-24 40 views
0

我在我的數據庫表Foo上有幾條記錄,我需要聚合一個列來合計它的值。JPA NamedQuery與聚合函數和組合使用

表示表的實體是這樣的:

@Entity 
@Table(name = "FOO") 
@NamedQueries({ 
@NamedQuery(name = "Foo.total", query = "SELECT f.id, sum(f.someInt) AS 
SOME_INT, f.parentId FROM Foo f where f.parentId = 'root' group by 
p.parentId"), 
@NamedQuery(name = "Foo.findAll", query = "SELECT f from Foo f") }) 
public class Foo { 

@Id 
@Column(name = "ID", insertable = false, updatable = false) 
private String id; 

@Column(name = "PARENT_ID", insertable = false, updatable = false) 
private String parentId; 

@Column(name = "SOME_INT", insertable = false, updatable = false) 
private Integer someInt; 

public Foo() { 
} 

}

如果我把這個在我的DAO服務豆:

entityManager.createNamedQuery("Foo.total", Foo.class).getResultList(); 

我得到這個錯誤:

Caused by: java.lang.IllegalArgumentException: Cannot create TypedQuery for query with more than one return using requested result type [Foo] 

看來是臨時t JPA無法將返回值與對象Foo相匹配。如果是這樣,我該如何使這個工作?

如果我調用其他@NamedQuery「Foo.findAll」,它工作正常。

回答

0
SELECT f.id, sum(f.someInt) AS SOME_INT, f.parentId FROM Foo f 
where f.parentId = 'root' group by p.parentId" 

此查詢不會返回Foo實體,而是返回投影。

您可能希望創建一個自定義POJO,並使用您選擇的屬性並在創建查詢時將其用作返回類型。

參見thisthis link

+0

它工作。非常感謝你 – TiagoH