首页 > 解决方案 > 在 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
}

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

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

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

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

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

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

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

标签: javaspring-bootspring-data-jpa

解决方案


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

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);

推荐阅读