获取无法从Tridion 2011中的Hibernate查询中找到命名参数

获取无法从Tridion 2011中的Hibernate查询中找到命名参数,hibernate,tridion,tridion-2011,tridion-content-delivery,tridion-storage-extension,Hibernate,Tridion,Tridion 2011,Tridion Content Delivery,Tridion Storage Extension,在我的DAO类中,我有以下方法 public PublishAction findbyLatestPublishedDate(int tcmURI,int pubID) throws StorageException { log.info("Entering Method: JPAPublishActionDAO.PublishAction.findbyLatestPublishedDate"); StringBuilder queryBuilder = new StringBu

在我的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);
}
这是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表中


请提出建议。

关于JPQL或HQL的美妙之处在于,您可以在查询中使用Java类的属性。您不应该将JPQL语法与普通SQL语法结合使用。您应该用pb.tcmURI=:tcmURI,pb.PUBLICATION\u ID=:pubID和pb.LAST\u PUBLISHED\u日期替换pb.tcmURI=:tcmURI,pb.publicationId=:pubID和pb.LAST\u PUBLISHED\u日期。除此之外,您的参数映射应该包含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);
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)
}
或者,您可以将查询拆分为2,如下所示:

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);
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属性


希望这能有所帮助。

关于JPQL或HQL的美妙之处在于,您可以在查询中使用Java类的属性。您不应该将JPQL语法与普通SQL语法结合使用。您应该用pb.tcmURI=:tcmURI,pb.PUBLICATION\u ID=:pubID和pb.LAST\u PUBLISHED\u日期替换pb.tcmURI=:tcmURI,pb.publicationId=:pubID和pb.LAST\u PUBLISHED\u日期。除此之外,您的参数映射应该包含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);
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)
}
或者,您可以将查询拆分为2,如下所示:

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);
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属性


希望这能有所帮助。

Hi Daniel,感谢您的回复。现在我收到order by子句的错误消息,说com.microsoft.sqlserver.jdbc.SQLServerException:order by子句在视图、内联函数、派生表、子查询和公共表表达式中无效,除非还指定了TOP或FOR XML,否则它并不像看上去那么简单。解决此问题的最简单方法是将查询拆分为2:从PublishAction pb中选择pb.id,其中pb.tcmuri=:tcmuri和pb.publicationId=:pubID按pb.lastPublishDate desc排序,然后从PublishAction pa中选择一个pa,其中pa.id=:myId,其中myId是从第一个查询提交的。您好,请更新您的示例代码Answer,因为您的注释不太清楚我的最终对象myId=super.executeQuerySingleResultsb.toString,queryParams;始终为空,因此不会返回任何结果Hi Daniel,上面的一个问题代码将生成异常queryBuilder.appendfrom PublishAction pb,其中pb.tcmuri=:tcmuri和pb.publicationId=:pubID order by pb.last_published_date desc;同一条目将有多条记录,并且您在最终发布中使用executeQuerySingleResult操作myAction=super.executeQuerySingleResultqueryBuilder.toString,queryParams;这将生成列表返回super.executeQueryListResultqueryBuilderFinal.toString,queryParamsFinal,但是我想要tcmuri和发布id的最新最后记录条目…请建议Daniel,感谢您的回复,现在我收到了order by子句的Wired错误,该子句说com.microsoft.sqlserver.jdbc.SQLServerException:order by子句在视图、内联函数、派生表、子查询和公共表表达式中无效,除非还指定了TOP或for XML。它不像看上去那么简单。解决此问题的最简单方法是将查询拆分为2:从PublishAction pb中选择pb.id,其中pb.tcmuri=:tcmuri和pb.publicationId=:pubID按pb.lastPublishDate desc排序,然后从PublishAction pa中选择一个pa,其中pa.id=:myId,其中myId是从第一个查询提交的。您好,请更新您的示例代码Answer,因为您的注释不太清楚我的最终对象myId=super.executeQuerySingleResultsb.toString,queryParams;始终为空,因此不会返回任何结果Hi Daniel,上面的一个问题代码将生成异常queryBuilder.appendfrom PublishAction pb,其中pb.tcmuri=:tcmuri和pb.publicationId=:pubID order by pb.last_published_date desc;同一条目将有多条记录,并且您在最终发布中使用executeQuerySingleResult操作myAction=super.executeQuerySingleResultqueryBuilder.toString,queryParams;这将生成列表返回super.executeQueryListResultqueryBuilderFinal.toString,queryParamsFinal,但是我想要tcmuri和发布id的最新最后记录条目…请建议