web-dev-qa-db-ja.com

HQL:ある列で区別されるすべてのエンティティを選択する方法は?



簡単な質問:
この例では、すべてのオブジェクトを取得する必要がありますが、これらのオブジェクトには個別の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を超えるフィールドがある場合はどうなりますか?簡単な解決策はありますか?

ありがとう!

19
gennad

以下にサンプルクエリを示します。

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を使用することもできます。

17
Nayan Wadekar

CriteriaとProjectionを一緒に使用することもできます:

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

それが誰かを助けることを願っています。

26
Ashfak Balooch

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();

あなたの質問に従って、最初の解決策は正しい出力を提供します。

6
Kamal Singh

これを試して、それは私のために働いた:

SELECT FROM YourTableName 
WHERE somecolumnName=condition 
GROUP BY yourDistinctColumnName
2
Harz

個別のフィールドを使用するための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で行うことができます。

大丈夫かもしれません

0
San Lin Naing

@APC応答として

それは機能し、より明確にすることができます

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