首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有多个命名参数和结果集的Hibernate存储过程调用不起作用

具有多个命名参数和结果集的Hibernate存储过程调用不起作用
EN

Stack Overflow用户
提问于 2015-03-04 04:42:33
回答 2查看 8.5K关注 0票数 6

我有一个存储过程,它接收一个输入列表,然后输出一个结果集。使用的数据库是SQL Server2008,JPA2.1规范提供程序是Hibernate。

我的实体结构如下:

代码语言:javascript
运行
复制
@NamedStoredProcedureQuery(name = "ModelSearchByModel",
        resultClasses = ModelSearchByModelEntity.class,
        procedureName = "SPR_ModelSearchByModel",
        parameters = {
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "RegionCode", type = String.class),
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "BuildingCode", type = String.class),
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "ProductCode", type = String.class),
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "StatusCode", type = String.class),
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "MinWidth", type = Integer.class),
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "MaxWidth", type = Integer.class),
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "MinDepth", type = Integer.class),
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "MaxDepth", type = Integer.class),
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "MinArea", type = Integer.class),
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "MaxArea", type = Integer.class),
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "MinImperviousArea", type = Integer.class),
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "MaxImperviousArea", type = Integer.class)
})
@Entity
public class ModelSearchByModelEntity implements Serializable{

//Properties with @Id, @Basic and @Column annotations, along with getters and setters
}

现在,我尝试使用Spring DATA JPA

代码语言:javascript
运行
复制
public interface IModelSearchByModelRepository extends Repository<ModelSearchByModelEntity, String> {

    @Procedure(name = "ModelSearchByModel")
    List<ModelSearchByModelEntity> findByCriteria(@Param("RegionCode") String regionCode,
                                                  @Param("BuildingCode") String buildingCode,
                                                  @Param("ProductCode") String productCode,
                                                  @Param("StatusCode") String statusCode,
                                                  @Param("MinWidth") Integer minWidth,
                                                  @Param("MaxWidth") Integer maxWidth,
                                                  @Param("MinDepth") Integer minDepth,
                                                  @Param("MaxDepth") Integer maxDepth,
                                                  @Param("MinArea") Integer minArea,
                                                  @Param("MaxArea") Integer maxArea,
                                                  @Param("MinImperviousArea") Integer minImperviousArea,
                                                  @Param("MaxImperviousArea") Integer maxImperviousArea);
}

在上面的代码中,程序会失败,并显示“位置参数和命名参数的混合无效”。

然后,我尝试忽略DATA JPA并尝试使用StoredProcedureQuery,如下所示

代码语言:javascript
运行
复制
    StoredProcedureQuery storedProcedureQuery = entityManagerFactory.createEntityManager().createStoredProcedureQuery("ModelSearchByModel",ModelSearchByModelEntity.class);
    storedProcedureQuery.setParameter("RegionCode",regionCode);
    //all other parameter setters.. 


    return storedProcedureQuery.execute() ? storedProcedureQuery.getResultList() : null;

这样,我得到的错误如下

代码语言:javascript
运行
复制
Caused by: java.lang.IllegalArgumentException: Parameter with that name [ArchRegionCode] did not exist
    at org.hibernate.jpa.spi.BaseQueryImpl.findParameterRegistration(BaseQueryImpl.java:503) [hibernate-entitymanager-4.3.7.Final.jar:4.3.7.Final]

我不明白该怎么做才对。不确定是否有控制ParameterStrategy值的方法。

这里有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2016-03-29 23:31:32

如果要调用使用注释@NamedStoredProcedureQuery声明的存储过程,则应该使用方法createNamedStoredProcedureQuery,而不是createStoredProcedureQuery。后者是在您不想使用注释时使用的,在这种情况下,您必须手动注册参数。

因此,如果您想使用注释,可以编写如下代码

代码语言:javascript
运行
复制
entityManagerFactory.createEntityManager()
.createNamedStoredProcedureQuery("ModelSearchByModel", ModelSearchByModelEntity.class)
.setParameter("RegionCode",regionCode);

否则

代码语言:javascript
运行
复制
StoredProcedureQuery storedProcedureQuery = entityManagerFactory.createEntityManager().createStoredProcedureQuery("SPR_ModelSearchByModel",ModelSearchByModelEntity.class);
storedProcedureQuery.registerStoredProcedureParameter("RegionCode", String.class , ParameterMode.IN);
// etc.
storedProcedureQuery.setParameter("RegionCode",regionCode);
// etc.

请注意,在第二个示例中,要使用的名称是存储过程的原始名称。

票数 1
EN

Stack Overflow用户

发布于 2015-11-10 04:20:24

您必须先注册参数,然后才能进行设置:

代码语言:javascript
运行
复制
StoredProcedureQuery storedProcedureQuery = entityManagerFactory.createEntityManager().createStoredProcedureQuery("ModelSearchByModel",ModelSearchByModelEntity.class);

storedProcedureQuery.registerStoredProcedureParameter("RegionCode", String.class , ParameterMode.IN);
// register all the other parameters...

storedProcedureQuery.setParameter("RegionCode", regionCode);
// set all the other parameters...

return storedProcedureQuery.execute() ? storedProcedureQuery.getResultList() : null;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28841503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档