Проблема при создании HQL с таблицей соединений (@ManyToMany)

#java #hibernate #many-to-many #hql #jointable

#java #спящий режим #многие ко многим #hql #Присоединиться

Вопрос:

Я пытаюсь заставить HQL с таблицей соединений работать, но у меня просто не получается.

Вот мои аннотированные классы (удалены бесполезные части перед публикацией здесь):

 @Entity
@Table(name = "tab_usuarios")
public class Usuario {

    @ManyToMany(fetch=FetchType.LAZY, targetEntity=Cliente.class)
    @JoinTable(name = "tab_usuarios_clientes", joinColumns = { @JoinColumn(name = "fk_id_usuario") }, inverseJoinColumns = { @JoinColumn(name = "fk_id_cliente") })
    private List<Cliente> clientes;
}



@Entity
@Table(name = "tab_pontos")
public class Ponto {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "GENERIC_SEQ_GEN")
    private Integer id;

    @Column(name = "datahora")  
    private Date dataHora;

    @ManyToOne()
    @JoinColumn(name = "fk_id_usuario")
    private Usuario usuario;
}



@Entity
@Table(name = "tab_clientes")
public class Cliente {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "GENERIC_SEQ_GEN")
    @Column(name = "id")
    private Integer id;

    @Column(name = "nome")
    private String nome;
}
  

Затем я сделал следующий SQL-запрос:

 SELECT * FROM tab_pontos p
INNER JOIN tab_usuarios_clientes uc ON p.fk_id_usuario = uc.fk_id_usuario
INNER JOIN tab_clientes c ON uc.fk_id_cliente = c.id
INNER JOIN tab_usuarios u ON uc.fk_id_usuario = u.id
WHERE c.id = ? AND uc.fk_id_usuario = ?
  

И я попытался «перевести» его в этот HQL:

 SELECT p FROM Ponto p
INNER JOIN Usuario.clientes uc INNER JOIN Cliente c
INNER JOIN Usuario u
WHERE c = u.clientes.id
AND u.nome = ?
ORDER BY p.dataHora DESC
  

Итак, это дает мне следующую ошибку:

 Caused by: org.hibernate.hql.ast.QuerySyntaxException: Invalid path: 'null.clientes' [SELECT p FROM br.mgx.ponto.dominio.Ponto p INNER JOIN Usuario.clientes uc INNER JOIN Cliente c INNER JOIN Usuario u WHERE c = Usuario.clientes.id AND u.nome = ? ORDER BY p.dataHora DESC]
  

Чего мне не хватает? Я просто не могу понять, что не так с моим HQL.

Заранее спасибо.

Комментарии:

1. Объединения в HQL состоят в переходе от одного объекта к другому с использованием ассоциации: select u from User u inner join u.clientes например. В вашем запросе используется неизвестный объект Ponto. И он пытается использовать имя объекта (например, User) вместо имени псевдонима (например, u) для создания join: INNER JOIN Usuario.clientes , INNER JOIN Cliente c . Короче говоря, это вообще не HQL. Читать docs.jboss.org/hibernate/core/4.3/manual/en-US/html/ch16.html . Если вам нужна дополнительная помощь, опубликуйте соответствующие объекты.

2. Я добавил сущность Ponto для лучшего понимания. В любом случае я проверю документ, который вы только что предложили.