2013-06-17 6 views
0

: 나는 너무 오래 코멘트를 쓸 수 없습니다로서,당신이 ServiceImpl에서는 클래스 내에서 상응하는 Liferay하게 DynamicQuery 표현이 SQL (하위 선택) 복제 얼마나

SELECT * FROM journalarticle 
WHERE (urlTitle,version) IN 
(SELECT 
    urlTitle,MAX(version) 
FROM journalarticle 
WHERE structureId = 'structure-id' AND companyId = 10150 AND groupId = 10170 
GROUP BY urlTitle) 
ORDER BY createDate DESC 
LIMIT 0,4 
+1

DynamicQuery를 사용하여 이러한 콤플렉스 하위 선택을 표현하는 직접적인 방법은 보이지 않지만, 맞는 경우 일부 수정을 통해 수행 할 수 있습니다. –

답변

0

를 I 당신이 원하는 결과가 될 코드를 여기에 붙이고 있습니다. 나는 컴파일하거나 실행하지 않습니다.

DynamicQuery dynamicQuery=DynamicQueryFactoryUtil.forClass(JournalArticle.class); 
     dynamicQuery.addOrder(OrderFactoryUtil.desc("createDate")); 
     dynamicQuery.setLimit(0, 4); 

     DynamicQuery subQuery=DynamicQueryFactoryUtil.forClass(JournalArticle.class); 
     subQuery.setProjection(ProjectionFactoryUtil.projectionList().add(ProjectionFactoryUtil.property("_id")).add(ProjectionFactoryUtil.max("version"))); 
     subQuery.add(PropertyFactoryUtil.forName("structureId ").eq("structure-id")); 
     subQuery.add(PropertyFactoryUtil.forName("companyId").eq("10150")); 
     subQuery.add(PropertyFactoryUtil.forName("groupId").eq("10170")); 
     List<Long> ids=new ArrayList<Long>(); 
     try { 
      List<Object[]> list= JournalArticleLocalServiceUtil.dynamicQuery(subQuery); 

      for(Object[] object:list){ 
       //0th field would be _id 
       ids.add((Long)object[0]); 
      } 
     } catch (SystemException e) { 
      // TODO Auto-generated catch block 
     } 

     dynamicQuery.add(PropertyFactoryUtil.forName("_id").in(ids.toArray())); 

     try { 
      List<JournalArticle> journalArticles=JournalArticleLocalServiceUtil.dynamicQuery(dynamicQuery); 
     } catch (SystemException e) { 
      // TODO Auto-generated catch block 
     } 

이 정보가 도움이되기를 바랍니다.

+0

이전에 수행 한 내용을 잊어 버렸습니다. 그러나 db에 대한 추가 호출을 생성하는 논리를 포함하는 부속 조회를 사용합니다. 하나의 최적 표현을 작성하는 방법이 있기를 바랬습니다. – Olaseni