Spring Data JPA + Hibernate + массив процедур PostgreSQL - PullRequest
0 голосов
/ 17 октября 2019

У меня проблема с использованием процедур PostgreSQL в Spring Data JPA. Моя процедура имеет два character varying[] массива в качестве входа и выхода. Я никак не могу заставить его работать.

Моя сущность очень проста:

@Entity
public class TestRecord {

    @Id
    @GeneratedValue
    private int id;
    private String testId;
    private String secondTestId;
}

Сначала я попытался использовать @Procedure аннотацию

@Repository
@NamedStoredProcedureQuery(name = "getTestIds", procedureName = "insert_test_id", resultClasses = Set.class,
                        parameters = {@StoredProcedureParameter (mode = ParameterMode.IN,name = "testids",type = Set.class),
                                      @StoredProcedureParameter (mode = ParameterMode.IN,name = "secondtestids",type = Set.class)})


public interface TestIdRecordRepository extends CrudRepository<TestRecord,Long> {

    @Procedure("insert_test_id")
    Set<TestRecord> getTestIds(@Param("testids") Set<String> testIds, @Param("secondtestids") Set<String> secondTestIds);
}

но я получаю java.lang.IllegalArgumentException: Type cannot be null ошибки.

Я пытался использовать собственные запросы:

@Repository
@NamedStoredProcedureQuery(name = "getTestIds", procedureName = "insert_test_id", resultClasses = Set.class,
                        parameters = {@StoredProcedureParameter (mode = ParameterMode.IN,name = "testids",type = Set.class),
                                      @StoredProcedureParameter (mode = ParameterMode.IN,name = "secondtestids",type = Set.class)})


public interface TestIdRecordRepository extends CrudRepository<TestRecord,Long> {

    @Query(nativeQuery = true, value = "select * from insert_test_id(:testids, :secondtestids)")
    Set<TestRecord> getTestIds(@Param("testids") Set<String> testIds, @Param("secondtestids") Set<String> secondTestIds);
}

Однако hibernate разделяет аргументы, и существует много одиночных character varying аргументов вместо двух character varying[] массивы.

Наконец, я попытался создать массивы непосредственно из этих значений разделения:

@Repository
@NamedStoredProcedureQuery(name = "getTestIds", procedureName = "insert_test_id", resultClasses = Set.class,
                        parameters = {@StoredProcedureParameter (mode = ParameterMode.IN,name = "testids",type = Set.class),
                                      @StoredProcedureParameter (mode = ParameterMode.IN,name = "secondtestids",type = Set.class)})


public interface TestIdRecordRepository extends CrudRepository<TestRecord,Long> {

    @Query(nativeQuery = true, value = "select * from insert_test_id(ARRAY[:testids], ARRAY[:secondtestids])")
    Set<TestRecord> getTestIds(@Param("testids") Set<String> testIds, @Param("secondtestids") Set<String> secondTestIds);
}

Однако на этот раз вместо character varying[] типа я получаю record[] типов.

Попытался сделать это в EntityManager, но получил точно такие же результаты.

Я знаю, что по этой причине существует UserType, но я не видел ни одного примера их использования в процедурах. у моей сущности нет сложных типов.

Может ли кто-нибудь помочь?

...