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

gen*_*nad 20 hibernate hql



一个简单的问题:
在这个例子中,我需要检索所有对象,但这些对象必须具有不同的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.


Kam*_*ngh 6

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)

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