java - 在 Spring Boot 中从 CrudRepository 访问表的几列
问题描述
我有一个扩展 crud 存储库的接口
public interface PersonRepo extends CrudRepository<Person, String> {
@Query(value="select name from PERSON where addr=?1", nativeQuery = true)
List<Person> getPeronUsingAddress(String addr);
}
Person 实体如下所示:
class Person {
private String name;
private String phoneNumber;
private String address;
//along with getters setters and all basic hibernate annotation to persist and retrieve
}
人对象被保存到数据库中,并且在检索本机查询时工作正常,因为休眠执行正确的查询。但我无法获得返回类型。
如果返回类型是人员列表,那么我将收到InvalidDataAccessResourceUsageException
如果我创建一个接口并使用接口列表作为返回类型,例如
interface response { String getName(); } List of Response interface getPeronUsingAddress(String addr);
然后我在服务中获取代理对象。我无法从代理对象获取数据。
我做的另一种方法是使用对象列表作为返回类型。但是不可能向下转换为我的 Person 对象。
怎么做。?或者是否有任何其他解决方案可以让我从 crud 存储库返回选择性列并获取具有这些选定列的 Java 对象。
解决方案
为了从实体中获取选定的列,您可以执行以下操作:
class Person {
private Integer id;
private String name;
private String phoneNumber;
private String address;
//along with getters setters and all basic hibernate annotation to persist and retrieve
}
创建一个 DTO 或 Java 对象,如下所示:
public class PersonDTO {
private Integer id;
private String name;
private String phoneNumber;
private String address;
public PersonDTO(Integer id, String name, String phoneNumber, String address) {
// logic here
}
//If you want just want name and phone number.
public PersonDTO(String name, String phoneNumber) {
// logic here
}
// you can't create overridden constructors as all members are of same type and at runtime program won't be able to differentiate unless you provide some logic for it.
// getters, setters, any other methods here...
}
现在下面将是您的查询,但它不是本机的,如果您想保留本机查询,那么您需要像这里一样使用 ResultTransformer
@Query("select new your.package.PersonDTO(p.name, p.phoneNumber) from Person p where p.id = :id")
public PersonDTO getPersonById(Integer id);
推荐阅读
- spring-cloud - Spring Cloud Eureka + FeignClient + Ribbon:负载均衡器没有可用于客户端的服务器
- c++ - 代码错误:线程 1:EXC_BAD_ACCESS(代码=1,地址=0x0)
- c# - 如何在 odata 中正确取消操作
- php - Wordpress - WooCommerce Polylang 集成 - 仅具有一种语言的产品
- python - 安装“matplotlib”时遇到问题
- slack - 通过 api 读取传入 slack webhook 的信息
- sql - 从 Spark SQL 中的字符串日期时间获取年份
- c# - 参数是否有合并运算符?
- html - CSS 显示:内联覆盖内部 div
- python - 如何创建散点图以将 2 个嵌套字典与另一个具有相同键的嵌套字典进行比较