Adn*_*ala 5 spring-data-jpa spring-boot
我正在使用 spring boot data jpa 1.4,我对它很陌生。我的表定义在这里。它相当简单,有 2 个表(组和用户)。
所述组表包含GROUP_ID(主键),组名,group_active(值= Y / N)。理想情况下,组表只能有一行,其中 group_active 为“Y”,其余的应为“N”
的用户表中包含的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 的正确方法是什么,这样我总是能找回一个属于活动组的名称为 的用户?
我已经根据您的设置进行了一些测试,解决方案需要使用过滤器(假设只有一个 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)
| 归档时间: |
|
| 查看次数: |
13300 次 |
| 最近记录: |