我使用的是Spring Boot数据jpa 1.4,对它来说还很陌生。
我的表定义是here。它相当简单,有2个表(组和用户)。

  • 表包含group_id(主键),group_name,group_active(值= Y/N)。
    理想情况下,组表只能有一行,其group_active为“Y”,其余应为“N”。
  • 用户表包含user_id(主键),user_name,group_id(组中的外键)。

  • 以下是我的实体类(class)

    组:
    @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的正确方法是什么,这样我总是可以找回一个属于事件组且名称为的用户?

    最佳答案

    我已经根据您的设置进行了一些测试,并且该解决方案将需要使用过滤器(假设只有一个Group的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')")
    

    10-07 19:15
    查看更多