目前我正在开发Spring Data Rest的POC。试图获得存储库的可用JSONout。
我有一个实体类(NewTask)
@Entity
@Table(name="newtable")
public class NewTask {
@Id
@Column(name="newid")
private int id;
@Column(name="newage")
private int age;
@Column(name="newaddress")
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
和相应的存储库..
@RepositoryRestResource
@PreAuthorize("hasRole('ROLE_ADMIN')")
public interface NewTaskRepository extends CrudRepository<NewTask, Serializable>{
@Query("SELECT t.address FROM NewTask t where t.id = :id")
String findByMyId(@Param("id") int id);
}
每当我点击
http://localhost:8080/POCDB/newTasks/search/findByMyId?id=1
我收到以下错误: {“cause”:null,“message”:“PersistentEntity不能为空!”}
现在我的存储库看起来如何:请阅读每个方法的评论
//Gives- PersistentEntity must not be null!!!
@Query("SELECT t.address FROM NewTask t where t.id = :id")
String findByMyId(@Param("id") int id);
//WORKS FINE
@Query("SELECT t.id FROM NewTask t where t.id = :id")
int findId(@Param("id") int id);
//WORKS FINE
@Query("SELECT t.id FROM NewTask t where t.id = :id")
Integer findIdTwo(@Param("id") int id);
//Gives- PersistentEntity must not be null!!!
@Query("SELECT t.id FROM NewTask t")
List<Integer> findIds();
我不确定返回类型有什么问题。我在下面的链接中提到了一些解决方案:
How does one create a custom query in jparepository but return an object other than the entity?
并在我的存储库中添加了2个方法,这些方法对我不起作用
// returns in some weird format
@Query("SELECT t.address FROM NewTask t where t.id = :id")
PString findByMyId(@Param("id") int id);
//Gives- PersistentEntity must not be null!!!
@Query("SELECT t.address FROM NewTask t")
List<PString> findAddress();
我有预感这是SDR中的一个错误,还是我错过了什么?
答案 0 :(得分:7)
Spring Data REST只能返回为其注册存储库的数据。在您引用的另一个问题中,您会注意到他们专门为他们需要的类型创建了一个自定义存储库。这不是SDR中的错误,它只是它的功能。它还使它保持RESTful。
因此,在您的情况下,SDR只能返回NewTask或NewTask的集合。
答案 1 :(得分:0)
在Spring Boot中,如果spring主应用程序无法扫描您的域(POJO)类,那么除非您将所有类放在同一个包中,否则将抛出此错误。然后,您在Spring主应用程序类
之上添加了组件扫描注释@ComponentScan(basePackages = "com.aaa.bbbb.ccccc")
答案 2 :(得分:0)
我使用的是Spring Data Mongo,而不是JPA,但是对我有用的是在Mongo的“ select”语句中包含 _class 字段。 Spring使用此字段将数据库结果映射回实体/文档中。
还请查看 @TypeAlias ,以便在围绕域类进行混洗时拥有一致的_class值。
当我用Spring projections 提前投影数据库结果时,我也遇到了同样的问题。后来,当我将结果转换为分页资源时,框架无法将投影接口识别为持久实体,因此无法找到为我进行转换所需的必要元数据。此用例的解决方案是自定义资源汇编器。