gpt4 book ai didi

java - Hibernate中连续命名参数问题(Spring HibernateTemplate)

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:37:17 25 4
gpt4 key购买 nike

我正在尝试使用命名参数将一些字符串注入(inject)到查询中。我正在使用 spring 和 hibernateTemplate,而且我对 Hibernate 还很陌生。我过去曾使用过未命名和命名参数,但似乎当它们彼此相邻时它们会抛出错误。我在下面为我的问题制作了类似的示例代码(经过简化以突出手头的问题)。 orderBy 包含一个字段的字符串,orderDirection 包含 ASC 或 DESC。

public List<HashMap<String, Object>> exampleList(String orderBy, String orderDirection) {
logger.debug(orderBy);
logger.debug(orderDirection);

final String queryString = "SELECT new map("+
"a.id AS id, "+
"a.name AS name, "+
"a.number AS number ) "+
"FROM Asset a "+
"ORDER BY :orderBy :orderDirection";

String[] parameterNames = {"orderBy", "orderDirection"};
Object[] parameterValues = {orderBy, orderDirection};

List<HashMap<String, Object>> results = (List<HashMap<String, Object>>) hibernateTemplate.find(queryString, parameterNames, parameterValues);

return results;
}

控制台调试我的参数:

DEBUG: com.myOrg.myProject.asset.AssetDAO - a.id
DEBUG: com.myOrg.myProject.asset.AssetDAO - desc

而且我知道这个查询可以单独运行,因为我已经通过将值直接放入查询字符串来测试它。我知道这是不好的做法,会让我暴露在注入(inject)中,这就是我不这样做的原因。

我得到的错误如下(为便于阅读缩短了堆栈跟踪,但这是唯一的错误,我可以根据要求提供完整的堆栈跟踪):

SEVERE: Servlet.service() for servlet dmat3 threw exception
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: : near line 1, column 118 [SELECT new map(a.id AS id, a.name AS name, a.number AS number ) FROM com.gsipt.dmat3.asset.Asset a ORDER BY :orderBy :orderDirection]
at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:31)
at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:24)
at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:59)
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:258)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:157)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:914)
at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:1)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:912)
at com.myOrg.myProject.asset.AssetDAO.exampleList(AssetDAO.java:142)
at com.myOrg.myProject.navigator.NavigatorController.assetGrid(NavigatorController.java:163)

同样,当有单独的参数时,这工作得很好,但当它们放在一起时,就会发生这种情况。可以使用未命名参数重新创建相同的错误,只有“意外标记”是第二个“?”在查询字符串中。如何将命名或未命名的两个参数并排放置,以便在 ORDER BY 语句中有意义。

谢谢,-悬崖

最佳答案

您正在使用查找,而不是

findByNamedParams

参见 here .对于 Spring 3 API,请参阅 here .

另请注意,HibernateTemplate 文档说

NOTE: As of Hibernate 3.0.1, transactional Hibernate access code can also be coded in plain Hibernate style. Hence, for newly started projects, consider adopting the standard Hibernate3 style of coding data access objects instead, based on SessionFactory.getCurrentSession().

关于java - Hibernate中连续命名参数问题(Spring HibernateTemplate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6549260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com