JPA hibernate in子句查询

时间:2017-02-05 13:49:49

标签: hibernate jpa spring-data-jpa

在我们的项目中,需要在生成的查询被触发之前修改它。

因此,我们有一个自定义存储库工厂,它将向查询中添加其他参数。

现在就是这样做的。

我们有一个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。 这会是一个问题吗?它应该不是列表吗?

1 个答案:

答案 0 :(得分:0)

我将hibernate降级到5.1.0.Final版本

之后,问题就解决了