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

Hibernate HQL:如何选择与某列不同的所有实体?,hibernate,hql,Hibernate,Hql,一个简单的问题: 在本例中,我需要检索所有对象,但这些对象必须具有不同的msgFrom字段。 当我使用 List<Message> list = getHibernateTemplate().find("select distinct m.msgFrom from Message m WHERE msgTo = ? AND msgCheck = 0", dinc); 我想这是因为Hibernate只检索一列,但我需要一个对象,而不是列我该怎么做我想我可以滚动一个逗号,即 List&



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

List<Message> list = getHibernateTemplate().find("select distinct m.msgFrom from Message m WHERE msgTo = ? AND msgCheck = 0", dinc);
我想这是因为Hibernate只检索一列,但我需要一个对象,而不是列
我该怎么做
我想我可以滚动一个逗号,即

List<Message> list = getHibernateTemplate().find("select distinct m.msgFrom, m.To, m.datetime, .......... from Message m WHERE msgTo = ? AND msgCheck = 0", dinc);
List List=getHibernateTemplate().find(“从消息m中选择不同的m.msgFrom、m.To、m.datetime,……,其中msgTo=?和msgCheck=0”,dinc);
但是如果我这里有20多个字段呢?有简单的解决方法吗?


谢谢

以下是示例查询:

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

或者,您也可以使用标准API。

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

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

希望它能帮助别人。

试试这个,它对我有用:

SELECT FROM YourTableName 
WHERE somecolumnName=condition 
GROUP BY yourDistinctColumnName

我得到了一个答案,Hibernate查询语言可以使用不同的字段。您可以使用
从航班路线中选择不同的(到城市)
。如果使用SQL查询,它将返回字符串列表。不能按实体类使用它返回值。因此,解决这类问题的答案是将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查询语句中,它得到了
不同的路由ID
,并作为列表输入。在查询中,从中的(列表)中过滤到_CITY的不同的

返回类型是实体Bean类型。因此,您可以在AJAX中使用它,例如自动完成


可能一切正常

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

Criteria criteria = session.createCriteria(Message.class);
criteria.setProjection(Projections.distinct(Projections.property("msgFrom ")));
List<String> msgFromList = criteria.list();
Criteria=session.createCriteria(Message.class);
标准.setProjection(Projections.distinct(Projections.property(“msgFrom”)));
List msgFromList=criteria.List();
如果希望结果包含整个消息类及其所有属性集,可以使用Hibernate result Transformer

Criteria criteria = session.createCriteria(Message.class);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
List<Message> messages = criteria.list();
Criteria=session.createCriteria(Message.class);
criteria.setResultTransformer(criteria.DISTINCT\u ROOT\u实体);
列表消息=criteria.List();
但它基于根实体进行过滤

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();
Criteria=session.createCriteria(Message.class);
ProjectionList projection=Projections.ProjectionList();
projection.add(projects.distinct(projects.property(“msgFrom”)));
//使用投影添加任意数量的列
添加(Projections.property(“msgTo”));
标准:设定投影(投影);
条件.setResultTransformer(Transformers.aliasToBean(Message.class));
List msgFromList=criteria.List();
根据您的问题,第一个解决方案给出正确的输出

As@APC响应


它是有效的,而且随着时间的推移,它会变得更加清晰

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

如果你想得到一个完整的实体,你可以使用Projections.Entity

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

“this”表示根实体。

但是有没有使用Criteria API的例子?Criteria API如何构建动态查询并减少运行时故障?这实际上是可行的。我找到的唯一可接受的解决方案。但是使用此解决方案,您不会收到来自每个msgfrom的唯一消息。谢谢。如果希望结果包含整个消息类及其所有属性集,该怎么办?它可以工作,并且可以更清楚地从对象o中选择,其中o.propCondition=条件组BY o.propDistinct
Criteria.SetProjection(
Projections.Distinct(Projections.Entity(typeof(YourEntityHere), "this")));