#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 для лучшего понимания. В любом случае я проверю документ, который вы только что предложили.