【发布时间】:2016-10-26 16:55:34
【问题描述】:
我无法从存储库方法返回实体类的特定属性。
异常堆栈跟踪
Resolving exception from handler
[public org.springframework.http.ResponseEntity<java.lang.Object>
org.springframework.data.rest.webmvc.RepositorySearchController.executeSearch
(
org.springframework.data.rest.webmvc.RootResourceInformation,
org.springframework.util.MultiValueMap<java.lang.String, java.lang.Object>,
java.lang.String,
org.springframework.data.rest.webmvc.support.DefaultedPageable,
org.springframework.data.domain.Sort,org.springframework.data.rest.webmvc.Persis
tentEntityResourceAssembler
)
]
: java.lang.IllegalArgumentException: PersistentEntity must not be null!
实体类
@Entity
@Table(name="reference_data")
@NamedQueries({
@NamedQuery(name="MyTable.findX", query = "SELECT t.name FROM MyTable t WHERE t.catId = 330 ")
})
public class MyTable implements Serializable {
@Id
private Long id;
@Column(name="cat_id")
private Long catId;
@Column(name="name")
private String name;
}
存储库界面
@RepositoryRestResource(collectionResourceRel = "myTables", path = "myTables")
//public interface MyTableDataRepository extends PagingAndSortingRepository<MyTable, Long> { // This didn't work.
public interface MyTableDataRepository extends JpaRepository<MyTable, Long> {
//@Query("SELECT a.name FROM MyTable a WHERE a.catId = 330 ") -- This didn't work.
//@Query(value= "SELECT r.name FROM my_table r ", nativeQuery = true) -- This didn't work either.
@Query("SELECT DISTINCT a.name FROM MyTable a WHERE a.catId = 330 ") // This didn't work either.
List<String> findX(); // This didn't work.
//List<MyDTO> findX(); // DTO with one property: String name.. didn't work either.
}
如您所见,即使根据数千个示例,上述存储库方法都不起作用。
我让它工作的唯一方法如下:
@Query("SELECT a FROM MyTable a WHERE a.catId = 330") // This WORKS
List<MyTable> findX(); // This WORKS
技术栈
+-------------------------------+-----------------+
| Dependency | Version |
+-------------------------------+-----------------+
| spring-boot-starter-web | 1.3.5.RELEASE |
| spring-boot-starter-data-jpa | 1.3.5.RELEASE |
| spring-boot-starter-data-rest | 1.3.5.RELEASE |
| HikariCP | 2.4.6 |
| postgresql | 9.3-1102-jdbc41 |
| JDK | 8 |
+-------------------------------+-----------------+
非常感谢任何帮助,让查询仅返回选定的属性才能工作。
【问题讨论】:
-
您遇到的是 Spring Data REST 的设计方式。它仅适用于实体。有关更多详细信息以及解决设计约束的方法,请参阅下面的@Will 答案。
标签: spring-boot spring-data-jpa spring-data-rest