2017-02-07 92 views
1

我正在使用spring啓動數據jpa 1.4,我對它很陌生。 我的表格定義是here。它非常簡單,有2個表(組和用戶)。內部加入春季啓動數據jpa

  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; 

用戶:

@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這樣,我總是回到屬於名爲活性基團一個用戶?

+0

您能夠運行'的findAll()'在用戶表? –

回答

0

我已經做了根據您的設置一些測試和解決方案將需要使用過濾器(假設只有一個集團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; 

WHE ñ,查詢數據

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')") 
+0

感謝您的回覆,但這不是OneToMany關係,因爲可能有多個用戶具有相同的名稱,但具有不同的group_id。因此它可能是一個ManyToOne,但絕對不是其他方式。 –

+0

對..請參閱我的更新解決方案 –

+0

我試過了你的建議,但它沒有奏效。使用Spring-boot-data-jpa的全部目的是避免編寫查詢和所有的鍋爐代碼。無論如何,我繼續在我的存儲庫中的自定義查詢。我確信有一種方法可以在不必編寫自定義查詢的情況下獲得此信息。 –