【问题标题】:Best way to get aggregate function result inside the entity object在实体对象中获取聚合函数结果的最佳方法
【发布时间】:2016-02-20 02:52:52
【问题描述】:

很多时候我必须在实体对象本身中获取 SQL 聚合查询结果。到目前为止,我可以通过以下代码实现同样的目标

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Tuple> q = cb.createTupleQuery();
    Root<Test> c = q.from(Test.class);
    q.multiselect(c, cb.count(c));
    q.groupBy(c.get("type"));

    TypedQuery<Tuple> t = em.createQuery(q);
    List<Tuple> resultList = t.getResultList();
    List<Test> list = new ArrayList<>();

    for(Tuple tuple : resultList){
        Test te = (Test) tuple.get(0);
        te.setQuantity((long)tuple.get(1));
        list.add(te);
    }

但我想知道什么是最好的方法。我的测试实体是

@Entity
@Table(name = "test")
public class Test {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "type")
    private Integer type = 0;

    @Transient
    private long quantity;
}

【问题讨论】:

  • 如何在注释上实现动态选择标准。除了 group by ,我将有条件选择。所以我不认为使用公式是一个好的选择,它通常用于派生值而不是聚合函数。
  • 如果我可以在公式中使用动态选择条件以及分组,请告诉我该怎么做。你能给我一个例子来说明我需要在它上面添加动态谓词的确切要求吗?
  • 如果您认为原始问题没有达到重点,您应该添加新问题或编辑现有问题。很难理解“条件选择”的含义。你是指什么样的条件?

标签: sql hibernate jpa aggregate-functions jpa-2.1


【解决方案1】:

如果您不能使用@Formula,那么我建议您在选择基础上创建一个数据库视图,并将一个附加实体映射到该视图。然后,您可以使用 @OneToOne@SecondaryTable 将其映射到现有实体。

这具有符合 JPA 的额外优势(即不使用 Hibernate 的专有 @Formula)并且看起来像:

@Entity
@Table(name = "test")
public class Test {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "type")
    private Integer type = 0;

    @OneToOne//or via secondary table
    private TestSummaryInfo summaryInfo;

    public long getQuantity(){
        return summaryInfo.getQuantity();
    }
}

摘要映射到视图:

@Entity
@Table(name = "vw_test_summary")
public class TestSummaryInfo {
    @Id
    @Column(name = "id")
    private Integer id;

    @Column(name = "quantity")
    private Long quantity;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 2010-09-13
    相关资源
    最近更新 更多