У меня проблема с использованием процедур 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
, но я не видел ни одного примера их использования в процедурах. у моей сущности нет сложных типов.
Может ли кто-нибудь помочь?