簡単な質問:
この例では、すべてのオブジェクトを取得する必要がありますが、これらのオブジェクトには個別の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が1列のみを取得するためだと思いますが、列ではなくオブジェクトが必要です。
これどうやってするの?
カンマをスクロールするだけでいいと思います。
List<Message> list = getHibernateTemplate().find("select distinct m.msgFrom, m.To, m.datetime, .......... from Message m WHERE msgTo = ? AND 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");
または、Criteria APIを使用することもできます。
CriteriaとProjectionを一緒に使用することもできます:
Criteria criteria = session.createCriteria( MyEntity.class );
criteria.setProjection( Projections.distinct( Projections.property( "id" ) ) );
それが誰かを助けることを願っています。
Hibernate基準は、明確な結果を選択するのが非常に簡単です。投影結果で単一の結果が返されるようにする場合は、次を使用できます。
Criteria criteria = session.createCriteria(Message.class);
criteria.setProjection(Projections.distinct(Projections.property("msgFrom ")));
List<String> msgFromList = criteria.list();
結果にすべてのプロパティセットを含むMessageクラス全体を含める場合は、Hibernate result Transformerを使用できます。
Criteria criteria = session.createCriteria(Message.class);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
List<Message> messages = 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();
あなたの質問に従って、最初の解決策は正しい出力を提供します。
これを試して、それは私のために働いた:
SELECT FROM YourTableName
WHERE somecolumnName=condition
GROUP BY yourDistinctColumnName
個別のフィールドを使用するためのHibernate Query Languageの回答があります。 SELECT DISTINCT(TO_CITY) FROM FLIGHT_ROUTE
を使用できます。 SQLクエリを使用する場合、文字列リストを返します。 Entity Classごとに戻り値を使用することはできません。したがって、そのタイプの問題を解決するための答えは、SQLでHQLを使用することです。
"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
およびリストとして入力します。 INクエリは、個別のTO_CITY
from IN
(リスト)。
戻り型はエンティティBean型です。したがって、AutoComplementなどのAJAXで行うことができます。
大丈夫かもしれません
@APC応答として
それは機能し、より明確にすることができます
SELECT FROM Object o
WHERE o.propCondition = condition
GROUP BY o.propDistinct