У меня аналогичный случай с этим вопросом [ссылка] (Как мне поступить с 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 : ".
Как я могу это решить?
Но без предложения where я получаю сообщение об ошибке "Ошибка проверки запроса для публичного абстрактного метода"
Конечно, потому что ваш запрос не является допустимым JPQL. Вот почему я посоветовал вам прочитать документацию по JPQL: чтобы вы могли изучить синтаксис языка.
можешь дать мне ссылку пожалуйста
Я полагаю, что тип вашего параметра длинный. это имя 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 ?
Зачем запросу параметр? Прочтите главу JPQL руководства пользователя гибернации. Там есть целый раздел о соединениях.