【问题标题】:Spring boot JPA fetch specific column from crudRepository querySpring Boot JPA 从 crudRepository 查询中获取特定列
【发布时间】:2019-03-27 07:57:38
【问题描述】:

我试图从我的 Employee 类中的用户类中获取“名称”字段,这样我就可以避免进行额外的查询来获取用户名。

目前,我只能通过这种方式获取 user_id

我的用户类

@Entity @Table(name="user", schema = "public") @Getter @Setter @NoArgsConstructor @Accessors(chain = true)
public class User implements Serializable{
    private @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name = "user_id") Long id;
    private @Column(unique = true) String email;
    private String name;
}

我的员工类

@Entity @Table(name = "employee",schema = "public") @Getter @Setter @NoArgsConstructor @Accessors(chain = true)
public class Employee implements Serializable {
    private @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name = "employee_id") Long id;
    @JsonIgnore @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "fk_user_id",insertable = false,updatable = false) private User user;
    private @Column(name="fk_user_id") Long userId;
}

我知道如果不选择它我无法检索名称,所以我尝试在我的 crudRepository 上使用自定义查询

public interface EmployeeRepository extends CrudRepository<Employee, Long>{
    @Query(value = "SELECT employee.*, public.user.name FROM public.employee INNER JOIN public.user ON public.user.user_id = employee.fk_user_id ", nativeQuery = true)
    List<Employee> findEmployees();
}

查询返回我期望的结果,但我不知道如何在我的 Employee 类中获取结果列“name”

欢迎任何帮助或指导,感谢阅读

【问题讨论】:

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


    【解决方案1】:

    在我看来,您应该只选择Employee,然后从获取的User 中获取名称。另外我认为您不需要查询是本地的:

    @Query(value = "SELECT e FROM public.employee e INNER JOIN FETCH e.user")
        List<Employee> findEmployees();
    }
    

    然后:

    for(Employee e: findEmplyees){
        String name = e.getUser.getName();
    }
    

    【讨论】:

    • 感谢您的回复,但如果我这样做,我将不得不进行两个查询,一个用于获取员工,另一个用于获取其对应的用户。这就是我试图避免的
    • 它是一个 eage fetch,因此用户将被加入到同一个查询中。如果您只选择员工然后对其调用 getUser() ,那么是的,在这种情况下会在 db 上进行另一个查询
    • 我刚刚尝试了您告诉我的方式,但在浏览器上出现此错误无法提取结果集; SQL [不适用];嵌套异常是 org.hibernate.exception.SQLGrammarException: 无法提取 ResultSet,控制台错误跟踪指向此 org.postgresql.util.PSQLException: ERROR: syntax error at end of input 但没有具体原因。我的查询如下@Query(value = "SELECT e FROM Employee e INNER JOIN FETCH User u")
    • 我的错误。更正了
    • 谢谢@Maciej,这样效果很好,但我仍然试图只获取用户名而不是整个用户,这可能吗?我只使用过 Spring Boot,JPA,休眠一周,所以我还在迷雾中哈哈,再次感谢您的时间和精力
    【解决方案2】:

    当您想要获取的数据多于实体类中描述的数据,并且您不想获取惰性关系时,您可以创建一个新类,例如一个 DAO 类,它将具有您想要的所有属性获取。因此,在您的情况下,可能EmployeeDAO 类具有员工实体的所有属性加上userName。然后将其用作返回的集合:

    @Query(your query)
    List<EmployeeDAO> findEmployees();
    

    【讨论】:

    • 感谢您的回复,但如果我这样做,我将不得不使用相应的表或视图创建一个新实体,并且我试图避免这种情况
    猜你喜欢
    • 2022-07-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 2014-07-01
    • 2021-08-17
    • 2021-10-13
    相关资源
    最近更新 更多