0

DAO 클래스에 다음 메소드가 있습니다.Tridion 2011에서 Hibernate Query에서 명명 된 매개 변수를 찾을 수 없습니다.

public PublishAction findbyLatestPublishedDate(int tcmURI,int pubID) throws StorageException 
{ 
    log.info("Entering Method: JPAPublishActionDAO.PublishAction.findbyLatestPublishedDate"); 
    StringBuilder queryBuilder = new StringBuilder(); 
    queryBuilder.append("select pa from PublishAction pa where pa.id in(select pb.id from PublishAction pb where pb.ITEM_REFERENCE_ID=:tcmURI and pb.PUBLICATION_ID=:pubID and rownum <= 1 order by pb.LAST_PUBLISHED_DATE desc)"); 

    Map<String, Object> queryParams = new HashMap<String, Object>(); 
    queryParams.put("ITEM_REFERENCE_ID", tcmURI); 
    queryParams.put("PUBLICATION_ID", pubID); 

    log.debug("JPAPublishActionDAO findbyLatestPublishedDate -> queryBuilder- "+ queryBuilder.toString());   
    return executeQuerySingleResult(queryBuilder.toString(), queryParams); 
} 

그것은 오류 아래주고있다 :

2013-01-16 12:17:01,381 ERROR DeployPipelineExecutor - Original stacktrace for transaction: tcm:0-5607662-66560 
java.lang.IllegalArgumentException: org.hibernate.QueryParameterException: could not locate named parameter [PUBLICATION_ID] 

이 내부적으로 내 로그에 HQL에 의해 생성 된 쿼리입니다 :

2013-01-16 12:17:01,365 DEBUG QueryTranslatorImpl - SQL: select publishact0_.ID as ID66_, publishact0_.ITEM_REFERENCE_ID as ITEM2_66_, publishact0_.LAST_PUBLISHED_DATE as LAST3_66_, publishact0_.PUBLICATION_ID as PUBLICAT4_66_, publishact0_.ACTION as ACTION66_, publishact0_.FLAG as FLAG66_, publishact0_.ITEM_TYPE as ITEM7_66_, publishact0_.SCHEMA_ID as SCHEMA8_66_, publishact0_.URL as URL66_ from AUTN_ITEMS publishact0_ where publishact0_.ID in (select publishact1_.ID from AUTN_ITEMS publishact1_ where publishact1_.ITEM_REFERENCE_ID=? and publishact1_.PUBLICATION_ID=? and rownum<=1 order by publishact1_.LAST_PUBLISHED_DATE desc) 

나는 PUBLICATION_ID 열뿐만 아니라 내 엔티티에 존재 볼 수 있습니다 내 SQL 테이블 에서처럼.

좋습니다.

답변

4

JPQL (또는 HQL)에 대한 아름다운 점은 쿼리에서 Java 클래스의 속성을 사용할 수 있다는 것입니다. JPQL 구문을 일반 SQL 구문과 결합해서는 안됩니다. pb.ITEM_REFERENCE_ID=:tcmURI, pb.PUBLICATION_ID=:pubIDpb.LAST_PUBLISHED_DATEpb.tcmuri=:tcmURI, pb.publicationId=:pubIDpb.last_published_date으로 대체해야합니다. 이 외에도 매개 변수 맵에는 ​​tcmURI 및 pubID가 포함되어 있어야합니다. 데이터베이스의 열을 엔티티의 실제 필드로 바꿨습니다.

queryBuilder.append("select pa from PublishAction pa where pa.id in(select pb.id from PublishAction pb where pb.tcmuri=:tcmURI and pb.publicationId=:pubID and rownum <= 1 order by pb.last_published_date desc)"); 

Map<String, Object> queryParams = new HashMap<String, Object>(); 
queryParams.put("tcmURI", tcmURI); 
queryParams.put("pubID", pubID); 

은 또한 당신이 단지 같은 2 쿼리를 분할 할 수 있습니다 :

StringBuilder queryBuilder = new StringBuilder(); 
queryBuilder.append("from PublishAction pb where pb.tcmuri=:tcmURI and pb.publicationId=:pubID order by pb.last_published_date desc"); 

Map<String, Object> queryParams = new HashMap<String, Object>(); 
queryParams.put("tcmuri", tcmURI); 
queryParams.put("pubID", pubID); 

final List<PublishAction> myActions = super.executeQueryListResult(queryBuilder.toString(), queryParams, 1); 

if (myActions != null && !myActions.isEmpty()) { 
    StringBuilder queryBuilderFinal = new StringBuilder(); 
    queryBuilderFinal.append("select pa from PublishAction pa where pa.id=:myId"); 

    Map<String, Object> queryParamsFinal = new HashMap<String, Object>(); 
    queryParamsFinal.put("myId", myActions.get(0).getId()); 

    return super.executeQuerySingleResult(queryBuilderFinal.toString(), queryParamsFinal) 
} 

참고 난 단지 추측 할 수의 이름이 무엇인지 결론적으로, 당신의 방법은 다음과 같이 될 것이다 Java 클래스의 속성을 사용하여 tcmuri, publicationIdlast_published_date 속성이 있다고 추측했습니다.

희망이 도움이됩니다.

+0

안녕하세요 대니얼, 답장을 주셔서 감사합니다. com.microsoft.sqlserver.jdbc.SQLServerException을 말하는 order by 절에 대해 오류가 발생했습니다. 뷰, 인라인 함수, 파생 테이블, 하위 쿼리 및 공통 테이블에서 ORDER BY 절이 잘못되었습니다. 표현식 (TOP 또는 FOR XML도 지정되지 않은 경우) –

+0

마치 그렇게 단순하지는 않습니다. 해결 방법은 가장 쉬운 방법은 2에서 쿼리를 분할하는 것입니다. "PublishAction pb에서 pb.id를 선택하십시오. 여기서 pb.tcmuri = : tcmURI 및 pb.publicationId = : pb.lastPublishDate desc로 pubID 순서"및 seconde 1 "pa 선택 from PublishAction pa where pa.id = : myId "여기서 myId는 첫 번째 쿼리에서 온 것입니다. –

+0

안녕하세요, 귀하의 의견으로는 명확하지 않으므로 상급자의 샘플 코드를 업데이트하십시오. –