【问题标题】:Access Few Columns of a table from CrudRepository in Spring Boot在 Spring Boot 中从 CrudRepository 访问表的几列
【发布时间】:2020-10-23 00:47:08
【问题描述】:

我有一个扩展 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
}

人员对象被保存到数据库中,并且在检索本机查询时工作正常,因为休眠执行正确的查询。但是我无法获取返回类型。

  1. 如果返回类型是人员列表,那么我会收到 InvalidDataAccessResourceUsageException

  2. 如果我创建一个接口并使用接口列表作为返回类型

     interface response {
        String getName();
     }
    
     List of Response interface getPeronUsingAddress(String addr);
    

    然后我在服务中获取代理对象。我无法从代理对象中获取数据。

  3. 我做的另一种方法是使用对象列表作为返回类型。但是不能向下转换为我的 Person 对象。

如何做到这一点。?或者是否有任何其他解决方案可以让我从 crud 存储库返回选择性列并获取包含这些选定列的 Java 对象。

【问题讨论】:

    标签: java spring-boot spring-data-jpa


    【解决方案1】:

    为了从实体中获取选定的列,您可以执行以下操作:

    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...
    
    }
    

    现在下面将是你的查询,但它不是原生的,如果你想保持原生查询,那么你需要使用像here这样的ResultTransformer

    @Query("select new your.package.PersonDTO(p.name, p.phoneNumber) from Person p where p.id = :id")
    public PersonDTO getPersonById(Integer id);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-04
    • 2016-07-01
    • 2019-03-27
    • 2017-10-01
    • 2018-05-12
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    相关资源
    最近更新 更多