2017-12-19 33 views
0

내 응용 프로그램에서 최대 절전 모드 ogm 5.1을 사용하고 있으며이 쿼리를 구성합니다. 이 쿼리집계 쿼리의 최대 절전 모드 OGM 결과

String query = "db.SWMessages.aggregate([ {0}, {1} ])"; 
    Document q1 = new Document("$match",new Document("messageUuid",new 
    Document("$ne" , id.toString()))); 
    Document q2 = new Document("$group", new Document("_id", 
    "$localReference").append("max", new Document("$max","$creationDate"))); 
    Object[] param = { q1.toJson(), q2.toJson() }; 
    String nativeQuery = MessageFormat.format(query, param); 
    List<SWMessageR> records = (List<SWMessageR>) em.createNativeQuery(nativeQuery, SWMessageImpl.class) 
      .getResultList(); 

는 위의 코드는 다음과 같이 쿼리를 생성합니다

db.SWMessages.aggregate([ { "$match" : { "messageUuid" : { "$ne" : "9c1464d7-311d-4b50-8b81-005bad055232" } } } , { "$group" : { "_id" : "$localReference", "max" : { "$max" : "$creationDate" } } } ]) 

내 질문이 쿼리의 결과가 SWMessageR 인 엔티티 객체를 다시 반환 할 것입니까?

답변

0

글쎄, 네가 쿼리를 실행하는 방식으로 클래스의 List 객체를 반환 할 것이다. 이러한 방법으로 주조를 사용할 필요가 없습니다, 그래서 당신은 다음과 같이 사용할 수 있습니다 :

List<SWMessageR> records = em.createNativeQuery(nativeQuery, SWMessageImpl.class).getResultList(); 
당신은 하나의 결과를 기대하는 경우에 비록, 나는이 방법을 사용하는 것이 좋습니다 것입니다

:

SWMessageR record = (SWMessageR) em.createNativeQuery(query1, SWMessageR.class).getSingleResult(); 

Hibernate Search Documentation Query Section을 살펴보고 모든 것이 명확 해집니다. 건배.

+0

답변 감사합니다. 그러나 위의 쿼리는 여러 항목을 가져올 수 있으므로 제안하는 방식이 도움이되지 않습니다. 문제는 그룹 쿼리가 반환 된 문서를 변환하므로 하이버 네이트가 쿼리 결과를 엔티티 개체로 매핑 할 수없는 지속성 예외 일 수 있다는 것이 었습니다. 몽고 문서를 살펴 보라고 제안합니다. 건배 – Invokergb

0

최대 절전 모드 OGM 엔티티로 결과를 변환 할 수 있습니다 https://docs.jboss.org/hibernate/stable/ogm/reference/en-US/html_single/#ogm-mongodb-queries-native

나는 그것이 당신의 기업을 대표하는 컬렉션의 문서 인 경우에 쿼리 반환하지만, 내가이 일을 기대 모르겠어요.

당신은 우리의 코드베이스의 예를 볼 수 있습니다

: SWMessageR는 엔티티 클래스라고 가정

List<SWMessageR> results = em 
     .createNativeQuery(nativeQuery, SWMessageR.class) 
     .getResultList(); 

: https://github.com/hibernate/hibernate-ogm/blob/master/mongodb/src/test/java/org/hibernate/ogm/datastore/mongodb/test/query/nativequery/MongoDBSessionCLIQueryTest.java#L111

것이 예상되는 엔티티 유형을 통과해야합니다, 그것은 다음과 같이 보일 것입니다 .

+0

안녕 Davide는 답장을 보내 주셔서 감사합니다. github의 예제는 일치를 만들고 결과 만 정렬합니다. 반환 객체는 실제로 엔티티입니다. 몽고에서는 문서별로 그룹화 할 때 모든 필드가 변환되지는 않습니다. 내 경우에는 결과는 {_id : localReference, max : maxDate} 유형의 여러 문서입니다. 멀리 까지이 내 SWMessageR 매핑 된 수 없습니다 이해할 수있는 결과는 해당 속성의 일부 값만 있음을 알았습니다. 쿼리에서 엔티티 객체에 존재하는 모든 속성을 투사한다면 quey가 엔티티 객체를 반환합니까? – Invokergb

+0

반환 된 값에 대해 null이 반환 될 것으로 예상됩니다. 그러나 나는 시험을 보지 않았기 때문에 잘못되었을 수도 있습니다. 연결된 클래스의 테스트가 유스 케이스와 일치하지 않으면 해당 클래스에 상황을 나타내는 추가 테스트를 작성할 수 있다고 생각합니까? 그것은 우리가 당신의 질문에 대답하는 데 도움이 될 것입니다. – Davide