代码之家  ›  专栏  ›  技术社区  ›  TiagoH

JPA NamedQuery与聚合函数和分组依据一起使用

  •  0
  • TiagoH  · 技术社区  · 7 年前

    我的数据库表Foo上有几条记录,我需要聚合一个列来对其值求和。

    @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服务bean上调用这个:

    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]
    

    JPA似乎无法匹配对象Foo的返回值。如果是这样的话,我怎样才能让它发挥作用?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Arnold Galovics    7 年前
    SELECT f.id, sum(f.someInt) AS SOME_INT, f.parentId FROM Foo f 
    where f.parentId = 'root' group by p.parentId"
    

    此查询不返回Foo实体,而是返回投影。

    您可能希望创建一个带有所选属性的自定义POJO,并在创建查询时将其用作返回类型。

    this this link