2011-01-19 3 views
16



간단한 질문 :
이 예제에서는 모든 개체를 검색해야하지만 이러한 개체에는 msgFrom 필드가 있어야합니다. 내가HQL : 일부 열에 의해 구분되는 모든 엔티티를 선택하는 방법은 무엇입니까?

List<Message> list = getHibernateTemplate().find("select distinct m.msgFrom from Message m WHERE msgTo = ? AND msgCheck = 0", dinc); 

를 사용하는 경우
나는 다음 오류 얻을 : 나는 Hibernate는 하나의 열을 검색하기 때문에 그것의 가정

java.lang.ClassCastException: java.lang.Integer cannot be cast to com.example.model.Message 

을하지만 객체가 아닌 열이 필요합니다.
어떻게해야합니까?
난, 난 그냥 쉼표를 스크롤 할 수 있다고 생각 즉

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

는 다른 방법으로, 당신은 또한 기준 API를 사용할 수 있습니다

답변

15

다음은 샘플 쿼리입니다.

+0

정말 고마워요, 정말 작동합니다 !! – gennad

+0

그러나 Criteria API를 사용하여이를 수행하는 방법에 대한 예제가 있습니까? – gennad

+1

Criteria API가 동적 쿼리를 빌드하고 런타임 실패를 줄이는 방법 - http://www.ibm.com/developerworks/java/library/j-typesafejpa/ –

23

또한 함께 기준 및 프로젝션을 사용할 수 있습니다

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

은 사람을 도움 바랍니다.

+0

감사합니다. 그리고 결과에 모든 속성 집합이 포함 된 전체 Message 클래스를 포함 시키려면 어떻게해야합니까? –

4

은 나를 위해 일한이 시도 :

SELECT FROM YourTableName 
WHERE somecolumnName=condition 
GROUP BY yourDistinctColumnName 
+1

HQL이 SQL이 아닙니다 ..... –

0

나는 고유 필드를 사용하는 최대 절전 모드 쿼리 언어에 대한 답을 가지고있다. 을 사용할 수 있습니다. SQL 쿼리를 사용하면 String List를 반환합니다. 엔티티 클래스에 의해 반환 값을 사용할 수 없습니다. 그래서 문제 유형을 풀기위한 답은 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_CITYIN (목록)에서 필터링합니다.

반환 유형은 엔터티 빈 유형입니다. 자동 완성과 같은 AJAX에서는 그렇게 할 수 있습니다.

모두 OK 일 수 있습니다.

5

최대 절전 모드는 별개의 결과를 선택하기 쉽습니다. 당신은 하나의 결과가 예상 결과를 반환하려면 , 당신은 사용할 수 있습니다 : 당신이 결과는 모든 속성 집합으로 전체 메시지 클래스를 포함 할 경우

Criteria criteria = session.createCriteria(Message.class); 
criteria.setProjection(Projections.distinct(Projections.property("msgFrom "))); 
List<String> msgFromList = criteria.list(); 

, 당신은 Hibernate가 변압기를 초래할 수 있습니다,

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

정확한 출력을 제공합니다.

관련 문제