При получении не удалось найти именованный параметр из Hibernate Query в Tridion 2011
У меня есть метод ниже в моем классе 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.
Пожалуйста, предложите.
1 ответ
Прекрасной особенностью JPQL (или HQL) является то, что вы можете использовать в своих запросах свойства вашего Java-класса. Вы не должны комбинировать синтаксис JPQL с простым синтаксисом SQL. Вы должны заменить pb.ITEM_REFERENCE_ID=:tcmURI
, pb.PUBLICATION_ID=:pubID
а также pb.LAST_PUBLISHED_DATE
с pb.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, поэтому я только предположил, что у вас есть tcmuri
, publicationId
а также last_published_date
свойства.
Надеюсь это поможет.