有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在Spring Boot中从CrudePository访问表的几列

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

person对象被保存到数据库中,当hibernate执行正确的查询时,在检索本机查询时工作正常。但我无法获取返回类型

  1. 如果返回类型是List of Person,那么我得到的是InvalidDataAccessResourceUsageException

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

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

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

  3. 我做的另一种方法是使用对象列表作为返回类型。但不可能对我的个人目标感到沮丧

怎么做。?或者有没有其他解决方案,通过它我可以从crud存储库返回选择性列,并获得带有这些选定列的Java对象


共 (1) 个答案

  1. # 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);