JPA/Hibernate 查询无法识别命名参数
JPA/Hibernate Query do not recognize named parameters
此方法不适用于参数
@Override
public List<T> findBy2Params(Class c, String param1, String value1, String param2, String value2) {
Query q = em.createQuery("select o from :class o where o.:param1 = ':value1' "
+ " and o.:param2 = 'value2' ");
q.setParameter("class", c.getName());
q.setParameter("param1", param1);
q.setParameter("value1", value1);
q.setParameter("param2", param2);
q.setParameter("value2", value2);
return q.getResultList();
}
在“:”上引发错误;不将其视为参数
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: : near line 1, column 15 [select o from :class o where o.:param1 = ':value1' and o.:param2 = 'value2' ]
您的查询将无效,因为您无法绑定 table 或类似的列名。
table名称和相关的列在执行计划开始运行时需要知道,它发生在参数绑定之前。
唯一的方法是在 传递给 HQL 之前 替换这些值,或者使用更动态的方法在运行时使用 Criteria API 例如。
此方法不适用于参数
@Override
public List<T> findBy2Params(Class c, String param1, String value1, String param2, String value2) {
Query q = em.createQuery("select o from :class o where o.:param1 = ':value1' "
+ " and o.:param2 = 'value2' ");
q.setParameter("class", c.getName());
q.setParameter("param1", param1);
q.setParameter("value1", value1);
q.setParameter("param2", param2);
q.setParameter("value2", value2);
return q.getResultList();
}
在“:”上引发错误;不将其视为参数
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: : near line 1, column 15 [select o from :class o where o.:param1 = ':value1' and o.:param2 = 'value2' ]
您的查询将无效,因为您无法绑定 table 或类似的列名。
table名称和相关的列在执行计划开始运行时需要知道,它发生在参数绑定之前。
唯一的方法是在 传递给 HQL 之前 替换这些值,或者使用更动态的方法在运行时使用 Criteria API 例如。