在我们的项目中,需要在生成的查询被触发之前修改它。
因此,我们有一个自定义存储库工厂,它将向查询中添加其他参数。
现在就是这样做的。
我们有一个Query Delegatte,它实现了javax.persistence.Query,我们拦截生成的Query并添加其他参数
到目前为止,使用hibernate 4.1.4
工作正常现在我们升级到Hibernate 5.2.2和jpa 2.2
基本上,我们读取参数并将其设置回Query对象。 它适用于除List之外的所有类型的参数。
private void setParameters(Query query) {
try {
Iterator<?> iter = getParameters().iterator();
while (iter.hasNext()) {
LOGGER.debug("Setting Parameter...");
Parameter param = (Parameter) iter.next();
Object obj = null;
try {
obj = getParameterValue(param);
} catch (Exception e) {
LOGGER.debug("****Exception while getting param value****:" + e.getMessage());
}
query.setParameter(param.getName(), obj);
}
} catch (Exception e) {
LOGGER.error("****Exception in setParameters:****:" + e.getMessage());
}
}
在使用IN子句的情况下失败,List作为参数传递,如下面的
@Query("select new com.mypackage.UserInfo(m.usrmstId, m.usrName)
from UsrMst m where m.usrName in :names ")
public List<UserInfo> getUserByNames(@Param("names")List<String> names);
在阅读此类收集参数时,我得到以下异常。
Could not resolve QueryParameter reference [org.hibernate.engine.query.spi.NamedParameterDescriptor@63bd748] to QueryParameterBinding
在处理list参数的方式中,hibernate 5.2.2是否有任何变化?
在调试模式下,我观察到org.hibernate.engine.query.spi.NamedParameterDescriptor对象的expectedType是String。 这会是一个问题吗?它应该不是列表吗?
答案 0 :(得分:0)
我将hibernate降级到5.1.0.Final版本
之后,问题就解决了