有没有办法在没有实体的情况下使用“@Procedure”注释?

Use*_*291 7 java spring stored-procedures spring-data-jpa spring-repositories

所以我想要一个“Void-Repository”,通过它可以访问不一定对实体进行操作的存储过程。

@Repository
public interface StoredProceduresRepository extends CrudRepository<Void, Long> {

    @Procedure("my_answer_giver")
    String getMyAnswer(@Param("input") String input);
}
Run Code Online (Sandbox Code Playgroud)

但这当然行不通,因为CrudRepository期望Void成为一个实体。

有没有一种方法可以使用@Procedure注释而无需创建虚拟实体,或者我是否坚持使用使用EntityManager通过准备好的语句进行查询的实现类?

因为说实话,这很丑陋:

@Repository
public class StoredProceduresRepository {

    @PersistenceContext
    EntityManager em;

    public String getMyAnswer(String input) {
        Query myAnswerGiver = em
            .createStoredProcedureQuery("my_answer_giver")
            .registerStoredProcedureParameter("input", String.class, ParameterMode.IN)
            .setParameter("input", input);
        Object result = ((Object[]) myAnswerGiver.getSingleResult())[0];
        return (String) result;
    }
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*roj 4

如果你可以的话,你可以使用你拥有的任何实体来代替这个Void。那里提供的实体应该不重要。

public interface StoredProceduresRepository extends JpaRepository<SomeUnrelatedEntity, Long> {

        @Procedure("my_answer_giver")
        String getMyAnswer(@Param("input") String input);

}
Run Code Online (Sandbox Code Playgroud)

我一直在数据库视图中使用它。

  • 如果您的系统中有某种“BaseEntity”,您可以尝试使用它。或者也许是 Spring 的 `AbstractPersistable`:https://docs.spring.io/autorepo/docs/spring-data-jpa/current/api/org/springframework/data/jpa/domain/AbstractPersistable.html (2认同)