Spring Data JPA - Использование @Query с отношениями «многие ко многим» / Таблица соединений - PullRequest
0 голосов
/ 22 мая 2018

У меня есть объект User с отношением «многие ко многим» с объектом Role.

    @Entity
@Table(name = "auth_user")
public class OAuthUser {

    // @Autowired
    // @Transient
    // private PasswordEncoder passwordEncoder;
    //
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "username")
    private String userName;

    @Column(name = "password")
    @JsonIgnore
    private String password;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "email")
    private String email;

    @Column(name = "is_enabled")
    private boolean isEnabled;

    /**
     * Reference:
     * https://github.com/nydiarra/springboot-jwt/blob/master/src/main/java/com/nouhoun/springboot/jwt/integration/domain/User.java
     * Roles are being eagerly loaded here because they are a fairly small
     * collection of items for this example.
     */
    @ManyToMany(fetch = FetchType.EAGER)
    @Fetch(value = FetchMode.SUBSELECT)
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
    private List<Role> roles;

    @ManyToMany(fetch = FetchType.EAGER)
    @Fetch(value = FetchMode.SUBSELECT)
    @JoinTable(name = "user_properties", joinColumns = @JoinColumn(name = "AuthID", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "PropertyID", referencedColumnName = "id"))
    private List<Property> properties;

Я использую репозитории Spring Data JPA и смог бы создать пользовательский @Query который возвращает список пользователей на основе определенного идентификатора роли.

    @Query("SELECT u FROM auth_user as u WHERE u.isEnabled AND u.id IN"
        + " (SELECT r.user_id FROM user_role as r WHERE r.role_id = ?1)")
public List<OAuthUser> findByRole(int roleID);

Приведенный выше код приводит к ошибке auth_user is not mapped.Я понимаю, почему я получаю ошибку;платформа использует имена объектов (OAuthUser), а не таблицу (auth_user) для выполнения запроса.Обычно это не было бы проблемой, за исключением того, что для user_role нет сущности;это просто таблица соединений с двумя столбцами: 'user_id' и 'role_id'.

Как правильно этого добиться?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вы используете имя таблицы (auth_user) внутри себя jpql @Query.Вы должны использовать имя класса OAuthUser вместо:

@Query("SELECT u FROM OAuthUser u ...")
public List<OAuthUser> findByRole(int roleID);

Если вы хотите использовать SQL вместо jpql, вам нужно использовать так:

@Query(value = "SELECT * FROM auth_user ..." , nativeQuery=true)
public List<OAuthUser> findByRole(int roleID);

Таким образом, вы могли бы упомянуть имя таблицы и столбцы.

0 голосов
/ 22 мая 2018

Ошибка говорит:

auth_user не отображается

Это относится к auth_user, используемому в запросе, например SELECT u FROM auth_user.Вместо этого в запросе должно быть OAuthUser.

...