【问题标题】:Sort by joined table's field Spring JPA按联接表的字段 Spring JPA 排序
【发布时间】:2016-09-28 22:28:30
【问题描述】:

我有两个实体类Request,User:

//Ommiting some annotations for brevity
 public class User{    
   private Long id;
   private String name;
   private Integer age;
}

public class Request{
  private Long id;
  private String message;
  private Date createTime;

  @ManyToOne
  @JoinColumn(name="user_id")
  private User user;
}

我可以按创建时间对请求列表进行排序:

Sort = new Sort(Direction.ASC,"createTime");

有没有办法按用户名对请求列表进行排序?喜欢:

Sort = new Sort(Direction.ASC,"User.name");

【问题讨论】:

标签: spring spring-data-jpa


【解决方案1】:

是的。 new Sort(Direction.ASC,"user.name"); 应该可以正常工作。

Spring Data JPA 会将用户从外部连接到请求并按连接列的名称排序,从而产生如下 SQL:

select 
  id, message, createTime 
from 
  Request r 
  left outer join User u on u.id = r.user_id 
order by 
  u.name asc

这在一对一和多对一关系上非常有效,但是因为使用左外连接来实现 order by 子句,如果连接实体表示多关系(如在一对多中),Sort 可能会导致返回重复记录的 SQL。之所以如此,是因为Sort 参数将始终导致新的左外连接,即使正在连接的实体已经在查询中连接!

编辑顺便说一句,有一张关于这个问题的公开票:https://jira.spring.io/browse/DATAJPA-776

【讨论】:

  • 这工作得很好,但如果参数是由用户从 swagger 决定的,我无法理解如何使它工作......用户将输入名称而不是 u.name 然后它不起作用.如果用户使用 u.name 一切都按预期工作:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 2018-01-02
  • 1970-01-01
相关资源
最近更新 更多