Spring Boot 数据 jpa 中的内连接

Adn*_*ala 5 spring-data-jpa spring-boot

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

  1. 所述表包含GROUP_ID(主键),组名,group_active(值= Y / N)。理想情况下,组表只能有一行,其中 group_active 为“Y”,其余的应为“N”

  2. 用户表中包含的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;
Run Code Online (Sandbox Code Playgroud)

用户:

@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;
Run Code Online (Sandbox Code Playgroud)

存储库类:

public interface UserRepository extends CrudRepository<User, Long>{        
    List<User> findByName (String name);
}
Run Code Online (Sandbox Code Playgroud)

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

  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=?
Run Code Online (Sandbox Code Playgroud)

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

Mac*_*ski 1

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

集团实体

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

     @OneToMany(mappedBy = "group")
     @Filter(name = "activityFilter")
     private Set<User> users;
Run Code Online (Sandbox Code Playgroud)

用户实体

@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;
Run Code Online (Sandbox Code Playgroud)

进行查询时

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

此外,如果有许多组的活动 = 'Y',请尝试以下操作:

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