【问题标题】:Inner join in spring boot data jpa春季启动数据jpa中的内部连接
【发布时间】:2017-06-25 01:26:53
【问题描述】:

我使用的是 spring boot data jpa 1.4,我对它还很陌生。 我的表定义是here。它相当简单,有 2 个表(组和用户)。

  1. group 表包含 group_id(主键)、group_name、group_active(values=Y/N)。 理想情况下,组表可以只有一行 group_active 到 'Y',其余的应该有 'N'

  2. user 表包含 user_id(主键)、user_name、group_id(来自组的外键)。

以下是我的实体类

组:

@Entity
@Table(schema = "HR",  name = "GROUPS")
public class Group {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "GROUP_ID")
    private Long id;

    @Column(name = "GROUP_NAME")
    private String name;

    @Column(name = "GROUP_ACTIVE")
    private String active;

用户:

@Entity
@Table(schema = "HR", name = "USERS")
public class User {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "USER_ID")
    private Long id;

    @Column(name = "USER_NAME")
    private String name;

    @Column(name = "GROUP_ID")
    private Long groupId;

    @ManyToMany
    @JoinTable(
        schema = "HR",
        name = "GROUPS",
        joinColumns = {@JoinColumn(table = "GROUPS", name = "GROUP_ID", insertable = false, updatable = false)},
        inverseJoinColumns = {@JoinColumn(table = "USERS", name = "GROUP_ID", insertable = false, updatable = false)}
    )
    @WhereJoinTable(clause = "GROUP_ACTIVE='Y'")
    private List<Group> group;

存储库类:

public interface UserRepository extends CrudRepository<User, Long>{        
    List<User> findByName (String name);
}

查询:这是我要执行的查询,是一个简单的内连接。

  SELECT U.*
  FROM HR.USER U, HR.GROUP G
  WHERE U.GROUP_ID=G.GROUP_ID
      AND G.GROUP_ACTIVE='Y'
      AND U.USER_NAME=?

编写@JoinTable 或@JoinColumn 的正确方法是什么,这样我总是可以取回一个属于活动组的用户,该用户名为?

【问题讨论】:

  • 你能在用户表中运行findAll()吗?

标签: spring-boot spring-data-jpa


【解决方案1】:

我已经根据您的设置进行了一些测试,解决方案需要使用过滤器(假设只有一个 Group_Activity = 'Y'):

组实体

@Entity
@Table(schema = "HR",  name = "GROUPS")
public class Group {

     @OneToMany(mappedBy = "group")
     @Filter(name = "activityFilter")
     private Set<User> users;

用户实体

@Entity
@Table(schema = "HR", name = "USERS")
@FilterDef(name="activityFilter"
       , defaultCondition="group_id = 
              (select g.id from groups g where g.GROUP_ACTIVE='Y')")
public class User {

@ManyToOne
@JoinColumn(name = "group_id")
private Group group;

查询时

session.enableFilter("activityFilter");
session.createQuery("select u from Group g inner join g.users u where u.user_name = :userName");

另外如果有很多组的活动 = 'Y' 然后试试这个:

@FilterDef(name="activityFilter"
       , defaultCondition="group_id in
              (select g.id from group g where g.GROUP_ACTIVE='Y')")

【讨论】:

  • 感谢您的回复,但这不是 OneToMany 关系,因为可能有多个用户具有相同的名称,但 group_id 不同。因此,它可能是 ManyToOne,但绝对不是相反。
  • 我尝试了您的建议,但没有奏效。使用 Spring-boot-data-jpa 的全部目的是避免编写查询和所有样板代码。无论如何,我继续在我的存储库中进行自定义查询。我确信有一种无需编写自定义查询即可获得此信息的方法。
  • 哦,我忘了说,spring-boot-data-jpa 还不支持过滤器,
猜你喜欢
  • 2020-08-19
  • 1970-01-01
  • 2023-01-25
  • 2015-06-26
  • 2020-05-17
  • 1970-01-01
  • 2016-01-30
  • 2018-05-20
  • 2013-11-12
相关资源
最近更新 更多