我使用的是Spring Boot数据jpa 1.4,对它来说还很陌生。
我的表定义是here。它相当简单,有2个表(组和用户)。
理想情况下,组表只能有一行,其group_active为“Y”,其余应为“N”。
以下是我的实体类(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')")