在spring数据jpa中获取非表实体的数据

Posted

技术标签:

【中文标题】在spring数据jpa中获取非表实体的数据【英文标题】:Fetch data for non table entity in spring data jpa 【发布时间】:2018-03-20 07:14:38 【问题描述】:

我有列 id、mname、firstname、lastname、age(5 列)的用户表 使用 spring data jpa 我只需要获取 id、firstname、age(只有 3 列)

userentity 在 user.java 之下

 @Entity
    @Table(name = "user")
   public class User implements Serializable 

    private static final long serialVersionUID = -3009157732242241606L;
    @Id
    private long id;

    @Column(name = "mname")
    private String mName;

    @Column(name = "firstname")
    private String firstName;

    @Column(name = "firstname")
    private String firstName;

    @Column(name = "lastname")
    private String lastName;

    @Column(name="age")
    private int age;

    //constructor with fileds


user2.java contains the fileds

private Long id;
private String firstname;
private int age;

//getter and setter

UserRepository.java

public interface UserRepository extends CrudRepository<User, Long> 
@Query(value="SELECT usr.id as id,usr.firstname as firstName, usr.age as age FROM user usr WHERE usr.id=?1", nativeQuery=true)
List<User2> getUserDetailsByUserId(Long id);

在 colsole 中出现以下错误:

org.springframework.core.convert.ConverterNotFoundException: 否 发现能够从类型 [java.math.BigInteger] 转换的转换器 输入 [com.user.entity.User2]

检查代码时出现错误:

无法从类型 [java.lang.Object[]] 转换为类型 [com.user.entity.User2] 为值 '403, firstnnnnnn, 26';

有没有办法将值映射到 user2(非表实体)?

【问题讨论】:

【参考方案1】:

你应该使用projections:

Interface based:

public interface UserProjection 
    Long getId();
    String getFirstname();
    Integer getAge();


public interface UserRepository extends CrudRepository<User, Long> 
    List<UserProjection> findById(Long id);

Class based (DTO):

@Value // It's Lombok annotation
public class UserDto 
    Long id;
    String firstname;
    Integer age;


public interface UserRepository extends CrudRepository<User, Long> 
    List<UserProjection> findById(Long id);
    List<UserDto> getById(Long id);

【讨论】:

嗨@Cepr0,您使用投影提供的解决方案完全符合我的要求。感谢您的解决方案。

以上是关于在spring数据jpa中获取非表实体的数据的主要内容,如果未能解决你的问题,请参考以下文章

删除分离实体spring jpa Repository接口

Spring Boot Jpa框架自定义查询语句返回自定义实体

如何使用Spring数据jpa @Query注释直接获取学生列表

Spring Data JPA:查询如何返回非实体对象或对象列表?

用于在 Spring Data Jpa 中从多个表中获取数据的自定义查询

Spring数据jpa保存无法获取id