一个简单的问题:
在这个例子中,我需要检索所有对象,但这些对象必须具有不同的msgFrom字段.
我用的时候
List<Message> list = getHibernateTemplate().find("select distinct m.msgFrom from Message m WHERE msgTo = ? AND msgCheck = 0", dinc);
Run Code Online (Sandbox Code Playgroud)
我得到下一个错误:
java.lang.ClassCastException: java.lang.Integer cannot be cast to com.example.model.Message
Run Code Online (Sandbox Code Playgroud)
我想这是因为Hibernate只检索一列,但我需要一个对象,而不是列.
我怎样才能做到这一点?
我想我可以滚动一个逗号,即
List<Message> list = getHibernateTemplate().find("select distinct m.msgFrom, m.To, m.datetime, .......... from Message m WHERE msgTo = ? AND msgCheck = 0", dinc);
Run Code Online (Sandbox Code Playgroud)
但如果我在这里有超过20个字段怎么办?有一个简单的解决方案吗?
谢谢!
Ash*_*och 26
您还可以一起使用标准和投影:
Criteria criteria = session.createCriteria( MyEntity.class );
criteria.setProjection( Projections.distinct( Projections.property( "id" ) ) );
Run Code Online (Sandbox Code Playgroud)
希望它对某人有帮助.
Nay*_*kar 17
以下是示例查询:
select e from Message e
where e.msgFrom IN (select distinct m.msgFrom
from Message m
WHERE m.msgTo = ?
AND m.msgCheck = "0");
Run Code Online (Sandbox Code Playgroud)
或者,您也可以使用Criteria API.
Hibernate标准很容易选择不同的结果.如果要在投影结果中返回单个结果,可能需要使用:
Criteria criteria = session.createCriteria(Message.class);
criteria.setProjection(Projections.distinct(Projections.property("msgFrom ")));
List<String> msgFromList = criteria.list();
Run Code Online (Sandbox Code Playgroud)
如果希望结果包含整个Message类及其所有属性集,则可以使用Hibernate结果Transformer,
Criteria criteria = session.createCriteria(Message.class);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
List<Message> messages = criteria.list();
Run Code Online (Sandbox Code Playgroud)
但它根据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();
Run Code Online (Sandbox Code Playgroud)
根据您的问题,第一个解决方案提供正确的输
| 归档时间: |
|
| 查看次数: |
89802 次 |
| 最近记录: |