Как получить данные из отношения «многие ко многим» в HQL, с помощью Spring и JPA, когда joinTable не является сущностью?

У меня аналогичный случай с этим вопросом [ссылка] (Как мне поступить с HQL, многие ко многим?) Я хочу иметь количество пользователей (объект 1) для каждой клеветы на роль (объект 2). Я определил отношение многие ко многим между пользователем и ролью.

Я использую Spring MVC, Hibernate, MySQL и JPA.

Объект 1: Пользователь

@Entity(name = "user")
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String email;
 @ManyToMany(mappedBy = "user")
    private List<Role> role;

Объект 2: Роль

@Entity
@Table(name = "role")
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int ID;
    private String libelle;
    @ManyToMany
    @JoinTable(
            name = "user_role",
            joinColumns = { @JoinColumn(name = "ID_role") },
            inverseJoinColumns = { @JoinColumn(name = "id_user") }
    )
    private List<User> user;

Репозиторий JPA

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
 @Query(value = "select new map( count(u.id) as numberOfUsers,r.libelle as roleLibelle )  FROM user  u join  role r where r.ID =: ????  group by r.libelle")
    List<Object> countByRoleList();

Я пытаюсь выяснить, что =: id, предложенное в вопросе, который я упомянул, должно быть в моем случае. Вместо "????" я пробовал ID, id, ID_role. Все, что я получаю, это ошибка

"Named parameter not bound : ".

Как я могу это решить?

Зачем запросу параметр? Прочтите главу JPQL руководства пользователя гибернации. Там есть целый раздел о соединениях.

JB Nizet 28.07.2019 17:07

Но без предложения where я получаю сообщение об ошибке "Ошибка проверки запроса для публичного абстрактного метода"

CodIn 28.07.2019 18:47

Конечно, потому что ваш запрос не является допустимым JPQL. Вот почему я посоветовал вам прочитать документацию по JPQL: чтобы вы могли изучить синтаксис языка.

JB Nizet 28.07.2019 18:48

можешь дать мне ссылку пожалуйста

CodIn 28.07.2019 22:23
0
5
116
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я полагаю, что тип вашего параметра длинный. это имя abc и оно относится к идентификатору. Следуй этим шагам:

  • Удалите пробел перед параметром. поэтому у вас будет (=: abc), а не (=: abc).

  • Ваш запрос зависит от внешнего параметра, использует аннотацию @param для указанного параметра. так что у вас будет ".....countByRoleList(@Param("abc") длинный идентификатор);"

Пример кода

@Repository
public interface UserRepository extends JpaRepository<User,Long> {
@Query(value = "select new map( count(u.id) as numberOfUsers,r.libelle as roleLibelle )  FROM user  u join  role r where r.ID =:abc  group by r.libelle")
List<Object> countByRoleList(@Param("abc") long id);

Примечание: abc — это предоставленный параметр. Это может быть HTML-страница, функция. вы также можете предоставить его вручную ...

Пожалуйста, @CodIn ?

Arnaud 28.07.2019 23:44

Другие вопросы по теме