一个简单的问题:
在这个例子中,我需要检索所有对象,但这些对象必须具有不同的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个字段怎么办?有一个简单的解决方案吗?
谢谢!
答案 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")));
“此”表示根实体。