用springjpa调用java存储过程

scyqe7ek  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(492)

我需要使用jpa调用一个存储过程。存储过程对多个表进行操作,并返回这些表中的一些列。
尝试使用@procedure它似乎不起作用,在这种情况下总是找不到存储过程。
使用本机查询直接调用过程是成功的,但是使用这种方法,我需要将返回的结果Map到对象的列表。
我在存储库中的实现如下所示,

@Query(value = "EXECUTE dbs.multitable_Test :inputObj", nativeQuery = true)
List<sp> multitable_Test(@Param("inputObj")String inputObj);

存储过程返回的结果需要Map到sp类。
当我们在单个结果集中有多个表响应时,如何实现这一点?
已经从这个链接尝试了attributeconvert,仍然得到下面的异常。 org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type 感谢您的帮助。

pgvzfuti

pgvzfuti1#

首先,这实际上不是过程的用例。过程旨在修改数据库中的数据,而不返回任何值,然后可以使用:

@Procedure(procedureName = "procedure_name")
void procedure(); // notice void

你应该使用函数 create function 语法。函数可以修改数据并返回结果。
其次,如果您想将它Map到某个类,我将看到两个解决方案(使用 EntityManager ):
使用 ResultTransformer :

entityManager.createNativeQuery(
    "select * from function_name(:parameter)"
)
    .setParameter("parameter", parameter)
    .unwrap(org.hibernate.query.NativeQuery.class)
    .setResultTransformer(new ResultTransformer() {
        @Override
        public Object transformTuple(Object[] tuple, String[] aliases) {
            return new Sp(tuple[0]);
        }

        @Override
        public List transformList(List collection) {
            return collection;
        }

    })
    .getResultList();

请注意 ResultTransformer 已弃用,但功能强大,除非有合理的替换,否则不会删除,请参阅hibernate developer的说明。
使用 ResultSetMapping . 在实体上放置适当的注解:

@SqlResultSetMapping(
    name = "sp_mapping",
    classes = @ConstructorResult(
        targetClass = Sp.class,
        columns = {
            @ColumnResult(name = "attribute", type = Long.class)
        })
)

并使用Map作为参数调用函数:

entityManager.createNativeQuery(
    "select * " +
    "from function_name(:parameter);",
    "sp_mapping"
)
    .setParameter("parameter", parameter)
    .getResultList();

相关问题