我尝试执行一个看起来像这样的postgres存储过程:
CREATE OR REPLACE FUNCTION get_subjects()
RETURNS SETOF subject AS
$$
SELECT * FROM subject;
$$
LANGUAGE 'sql';
我有一个主题的POJO类,一个存储库和一个定义如下的服务:
@Entity
@Table(name = "subject")
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(name = "get_subjects",
procedureName = "get_subjects")
})
public class Subject {
@Id
@Column(name = "uid")
@Type(type = "pg-uuid")
private UUID uid;
private String name;
private String start_date;
private String end_date;
protected Subject(){
}
public Subject(UUID uid, String name, String start_date, String end_date) {
this.uid = uid;
this.name = name;
this.start_date = start_date;
this.end_date = end_date;
}
//getter setter
@Repository
public interface SubjectRepository extends CrudRepository<Subject, Long> {
@Procedure(name = "get_subjects")
Collection<Subject> retrieveSubjects();
}
@Service
public class SubjectService {
private final SubjectRepository subjectRepository;
@Autowired
public SubjectService(SubjectRepository subjectRepository) {
this.subjectRepository = subjectRepository;
}
public Collection<Subject> getAllSubjects(){
return subjectRepository.retrieveSubjects();
}
}
由以下原因引起的错误:
org.springframework.data.mapping.PropertyReferenceException:没有 找到类型为Subject!的属性retrieveSubjects。
我尝试实现一个SubjectRepositoryCustom,我在Collection<Subject>
上得到了一个nullpointer。我浏览了一些教程,例如https://dzone.com/articles/calling-stored-procedures-from-spring-data-jpa。
我还有一个存储过程在我的其他存储库之一上运行,我在其中插入了一个存储过程,这非常有效。
有人可以指出导致错误的原因并提供样本解决方案吗?
答案 0 :(得分:0)
对于您的restoreSubjects方法,可以使用CrudRepository中的findAll()。在这种简单情况下,不需要get_subjects()过程。请参见https://docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html
中的第一个示例对于过程,我使用nativeQuery并让Spring正确映射结果。
@Repository
public interface MyRepository extends CrudRepository<MyModel, Long> {
@Query(value = "CALL my_procedure()", nativeQuery = true)
List<MyModel> myProcedure();
}
如果您的过程检索了一些计算的/自定义的行,请确保它为每行中的@Id变量检索唯一值。我在使用错误的@Id列获取自定义过程结果时遇到了映射问题,并最终使用了带有未使用的主键自动增量列的临时表。