HQL:如何选择不同列的所有实体?

时间:2011-01-19 10:30:51

标签: hibernate hql



一个简单的问题:
在这个例子中,我需要检索所有对象,但这些对象必须具有不同的msgFrom字段 当我使用

List<Message> list = getHibernateTemplate().find("select distinct m.msgFrom from Message m WHERE msgTo = ? AND msgCheck = 0", dinc);

我收到下一个错误:

java.lang.ClassCastException: java.lang.Integer cannot be cast to com.example.model.Message

我想这是因为Hibernate只检索一列,但我需要一个对象,而不是列。
我该怎么做?我认为我可以滚动逗号,即

List<Message> list = getHibernateTemplate().find("select distinct m.msgFrom, m.To, m.datetime, .......... from Message m WHERE msgTo = ? AND msgCheck = 0", dinc);

但如果我在这里有超过20个字段怎么办?有一个简单的解决方案吗?

谢谢!

7 个答案:

答案 0 :(得分:26)

您还可以同时使用标准和投影:

Criteria criteria = session.createCriteria( MyEntity.class );
criteria.setProjection( Projections.distinct( Projections.property( "id" ) ) );

希望对某人有所帮助。

答案 1 :(得分:17)

以下是示例查询:

select e from Message e 
where e.msgFrom IN (select distinct m.msgFrom 
                      from Message m
                      WHERE m.msgTo = ? 
                      AND m.msgCheck = "0");

或者,您也可以使用Criteria API。

答案 2 :(得分:6)

Hibernate标准很容易选择不同的结果。 如果要在投影结果中返回单个结果,可能需要使用:

Criteria criteria = session.createCriteria(Message.class);
criteria.setProjection(Projections.distinct(Projections.property("msgFrom ")));
List<String> msgFromList = criteria.list();

如果希望结果包含整个Message类及其所有属性集,则可以使用Hibernate结果Transformer,

Criteria criteria = session.createCriteria(Message.class);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
List<Message> messages = criteria.list();

但它根据root实体进行过滤。

Criteria criteria = session.createCriteria(Message.class);

ProjectionList projection = Projections.projectionList();
projection.add(Projections.distinct(Projections.property("msgFrom")));
//Add as many columns as you want using Projection
projection.add(Projections.property("msgTo"));
criteria.setProjection(projection);

criteria.setResultTransformer(Transformers.aliasToBean(Message.class));
List<String> msgFromList = criteria.list();

根据您的问题,第一个解决方案提供正确的输出。

答案 3 :(得分:3)

试试这个,它对我有用:

SELECT FROM YourTableName 
WHERE somecolumnName=condition 
GROUP BY yourDistinctColumnName

答案 4 :(得分:0)

我有一个Hibernate查询语言的答案,可以使用Distinct字段。您可以使用SELECT DISTINCT(TO_CITY) FROM FLIGHT_ROUTE。如果使用SQL查询,则返回String List。您不能通过实体类使用它返回值。所以解决这类问题的答案是使用HQL和SQL。

"FROM FLIGHT_ROUTE F WHERE F.ROUTE_ID IN (SELECT SF.ROUTE_ID FROM FLIGHT_ROUTE SF GROUP BY SF.TO_CITY)";

从SQL查询语句中获取DISTINCT ROUTE_ID并输入为List。 IN查询会从TO_CITY(列表)中过滤出不同的IN

返回类型是实体Bean类型。所以你可以在AJAX中使用它,例如AutoComplement。

可能一切正常

答案 5 :(得分:0)

  

作为@APC响应

它可以工作,并且可以更清晰地显示为

SELECT FROM Object o 
WHERE o.propCondition = condition
GROUP BY o.propDistinct

答案 6 :(得分:0)

如果要使用DISTINCT获取整个实体,可以使用Projections.Entity

Criteria.SetProjection(
Projections.Distinct(Projections.Entity(typeof(YourEntityHere), "this")));

“此”表示根实体。