0

DAOクラスに以下のメソッドがあります。

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

1 に答える 1

4

JPQL(またはHQL)の優れている点は、Javaクラスのプロパティをクエリで使用できることです。JPQL構文をプレーンSQL構文と組み合わせないでください。pb.ITEM_REFERENCE_ID=:tcmURIpb.PUBLICATION_ID=:pubIDおよびpb.LAST_PUBLISHED_DATEpb.tcmuri=:tcmURI、、pb.publicationId=:pubIDおよびに置き換える必要がありpb.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クラスのプロパティの名前を推測することしかできないので、あなたがとプロパティを持っていると推測したことに注意しtcmuripublicationIdくださいlast_published_date

お役に立てれば。

于 2013-01-16T09:15:49.560 に答える