2016-03-19 32 views
0

Ich habe einen Benutzer mit Behörden (ManyToMany Beziehung):Frühling JPA holen ManyToMany

@Entity 
@Table(name = "user") 
public class User { 
    @JsonIgnore 
    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(
     name = "user_authority", 
     joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "user_id")}, 
     inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "name")}) 
    private Set<Authority> authorities = new HashSet<>(); 

} 


@Entity 
@Table(name = "authority") 
public class Authority implements Serializable { 

    @Id 
    @Column(length = 50, nullable = false) 
    private String name; 

} 

Liquibase (ohne Benutzer, er hat nur eine ID):

<createTable tableName="authority"> 
     <column name="name" type="varchar(50)"> 
      <constraints primaryKey="true" nullable="false"/> 
     </column> 
    </createTable> 

    <createTable tableName="user_authority"> 
     <column name="user_id" type="bigint"> 
      <constraints nullable="false"/> 
     </column> 
     <column name="authority_name" type="varchar(50)"> 
      <constraints nullable="false"/> 
     </column> 
    </createTable> 

    <addPrimaryKey columnNames="user_id, authority_name" tableName="user_authority"/> 
    ... 

Ich habe alle Benutzer holen Behörden, das ist ein Name. Zum Beispiel muss ich alle Admins holen (Benutzer, die die Berechtigung 'ROLE_ADMIN' haben).

+0

Ich denke, Ihre JPA-Mapping falsch ist. Sie verwenden ** @ ManyToMany ** -Anmerkungen in einer der Entitäten, aber nicht in der anderen. – ujulu

+0

Dieser Code von JHipster, also denke ich, ist es nicht. – Feeco

Antwort

1

Ohne benutzerdefinierte Abfrage, könnte diese Arbeit:

List<Authority> admin_authorities = authorityRepository.findByName("ROLE_ADMIN"); 
List<User> admins = userRepository.findByAuthoritiesIn(admin_authorities); 
0

Sie können direkt nach Entity statt nach Name suchen. Mit MEMBER OF teilen Sie JPA mit: "Holen Sie alle Entitäten, die X-Entity statt X-Collection haben".

@NamedQuery(name="findByAuth", 
      query="SELECT u FROM User u WHERE :auth "+ 
        "MEMBER OF u.authorities") 
public class User implements Serializable { 

    /* ... */ 
} 

In Ihrem Service:

public List<User> getByAuth(Authority auth) { 
    TypedQuery<User> query = em.createNamedQuery(
            "findByAuth", 
            User.class); 
    query.setParameter("auth", auth); 
    return query.getResultList(); 
} 
+0

Ich sollte nicht Benutzer Entity Manager, so habe ich versucht, JpaRepository Abfrage: '@Query (" Wählen Sie von Benutzer u WHERE? 1 Mitglied von u.authorities ")'. Das Ergebnis lautet: 'org.springframework.dao.InvalidDataAccessApiUsageException: Parameterwert [ROLE_ADMIN] stimmte nicht mit erwartetem Typ überein [com.test.model.Authority (n/a)]; Die geschachtelte Ausnahme ist java.lang.IllegalArgumentException: Der Parameterwert [ROLE_ADMIN] stimmt nicht mit dem erwarteten Typ [com.test.model.Authority (n/a)] '' überein – Feeco

Verwandte Themen