如何使用Hibernate Criteria API从连接表中选择不同的表?

时间:2017-05-15 12:13:42

标签: java sql hibernate criteria hibernate-criteria

我正在尝试实现这样的查询:

SELECT DISTINCT C.* FROM A
join B on A.some_id = B.some_id  
join C on B.some_id = C.some_id;

使用Hibernate Criteria API。 我需要为整个 C表创建不同的结果,而不仅仅是对于某些列。

我试着这样做:

Criteria criteria = createCriteria(C.class, "ct")
                .createCriteria("B", "bt")
                .createCriteria("A", "at")
                .//Some restrictions which are applied to all tables

就像那样:

Criteria criteria = createCriteria(A.class, "at")
                .createCriteria("B", "bt")
                .createCriteria("C", "ct")
                .//Some restrictions which are applied to all tables

(虽然我看不出有什么不同)。 尝试使用广告ResultTransformer:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

尝试将所有colums放入ProjectionsList,然后:

criteria.setProjection(Projections.distinct(projectionList));

但是该投影只会在列表中的第一列添加“distinct”关键字,但不会向整个表添加。

我想要实现的目标是这样的:

criteria.setProjection(Projections.distinct("C.*"));

但我只能在这里添加一列,不能在查询中使用通配符。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您应该从表'C'中选择列,而不是从表'A'中选择,如下所示。

SELECT distinct (*) FROM C

可以用hibernate标准编写如下:

Criteria criteria = session.createCriteria(C.class);
criteria  = criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
ResultTransformer rt = new DistinctRootEntityResultTransformer();
List list = rt.transformList(criteria.list());