2017-02-07 2 views
1

Ich benutze Spring Boot Daten jpa 1.4 und ich bin ziemlich neu dazu. Meine Tabellendefinition ist here. Es ist ziemlich einfach, es gibt 2 Tabellen (Gruppen und Benutzer).Inner Join im Frühjahr Boot Daten jpa

  1. Die Gruppe Tabelle enthält group_id (Primärschlüssel), group_name, group_active (Werte = Y/N). die Gruppentabelle hat im Idealfall nur eine Zeile, die mit ‚Y‘ hat group_active ist, sollte der Rest

  2. Die Benutzer Tabelle ‚N‘ hat enthält User_id (Primärschlüssel), benutzer_name, group_id (Fremdschlüssel aus Gruppe).

Im Folgenden sind meine Entitätsklassen

Gruppen:

@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; 

Benutzer:

@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; 

Repository Klasse:

public interface UserRepository extends CrudRepository<User, Long>{   
    List<User> findByName (String name); 
} 

Abfrage: Dies ist die Abfrage, die ich ausführen wollen, das ist eine einfache innere Verknüpfung.

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=? 

Was wäre der richtige Weg sein, um die @JoinTable oder @JoinColumn so, dass ich immer ein Benutzer wieder zu schreiben, die mit dem Namen der aktiven Gruppe gehört?

+0

Sind Sie in der Lage 'findAll()' in Benutzertabelle zu laufen? –

Antwort

0

Ich habe einige Tests auf dem Set-up auf Basis getan, und die Lösung müßte Filter verwenden (vorausgesetzt, es nur eine Gruppe mit Group_Activity = 'Y'):

Gruppe Entity

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

    @OneToMany(mappedBy = "group") 
    @Filter(name = "activityFilter") 
    private Set<User> users; 

Benutzer Entity

@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 n eine Abfrage machen

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

Zusätzlich, wenn viele Gruppen mit Aktivität sind = 'Y', dann versuchen Sie dies:

@FilterDef(name="activityFilter" 
     , defaultCondition="group_id in 
       (select g.id from group g where g.GROUP_ACTIVE='Y')") 
+0

danke für die Antwort, aber dies ist keine OneToMany-Beziehung, weil es mehr als einen Benutzer mit dem gleichen Namen, aber anderen group_id geben könnte. Daher könnte es ein ManyToOne sein, aber definitiv nicht umgekehrt. –

+0

richtig .. siehe meine Updates Lösung –

+0

Ich habe Ihren Vorschlag versucht, aber es hat nicht funktioniert. Der gesamte Zweck der Verwendung von Spring-boot-data-jpa bestand darin, das Schreiben der Abfragen und des gesamten Kesselblechcodes zu vermeiden.Jedenfalls ging ich mit einer benutzerdefinierten Abfrage in meinem Repository voran. Ich bin sicher, dass es eine Möglichkeit gibt, dies zu erreichen, ohne eine benutzerdefinierte Abfrage schreiben zu müssen. –

Verwandte Themen