Hibernate 为什么在尝试构造JPQL连接查询时会得到无效路径?
我正在使用JPA2.1、Hibernate 4.3.6.Final和MySQL 5.5.37。如何编写进行连接的JPQL查询?我在下面试Hibernate 为什么在尝试构造JPQL连接查询时会得到无效路径?,hibernate,jpa,jpa-2.0,inner-join,jpql,Hibernate,Jpa,Jpa 2.0,Inner Join,Jpql,我正在使用JPA2.1、Hibernate 4.3.6.Final和MySQL 5.5.37。如何编写进行连接的JPQL查询?我在下面试 final String jpqlQuery = "SELECT m FROM Message m LEFT JOIN MessageReadDate mr " + " INNER JOIN m.group g " + " LEFT JOIN g.classroom c " +
final String jpqlQuery = "SELECT m FROM Message m LEFT JOIN MessageReadDate mr " +
" INNER JOIN m.group g " +
" LEFT JOIN g.classroom c " +
" LEFT JOIN c.ROSTER u WHERE " +
" u.USER = :recipient AND " +
" u.ENABLED = 1 AND " +
" c.ENABLED = 1 AND " +
" g.NAME = '' AND " +
" m.author <> :author";
Query query = m_entityManager.createQuery(jpqlQuery);
我的集团实体如下
@Entity
@Table(name = "msg")
public class Message
{
@Id
@NotNull
@GeneratedValue(generator = "uuid-strategy")
@Column(name = "ID")
private String id;
@Column(name = "MESSAGE", columnDefinition="LONGTEXT")
private String message;
@ManyToOne
@JoinColumn(name = "GROUP_ID", nullable = false, updatable = true)
private Group group;
@Entity
@Table(name = "msg_group")
public class Group
{
@Id
@NotNull
@GeneratedValue(generator = "uuid-strategy")
@Column(name = "ID")
private String id;
@Column(name = "NAME")
private String name;
@ManyToOne
@JoinColumn(name = "CLASSROOM_ID", nullable = true, updatable = true)
private Classroom classroom;
那么为什么我不能引用“教室”属性呢
谢谢,-DaveHibernate报告的问题在第一行:
final String jpqlQuery = "SELECT m FROM Message m LEFT JOIN MessageReadDate mr "...
在左JOIN语句中。在hql中,联接必须表示关系,例如
LEFT JOIN m.MessageReadDate mr // the m is referencing the MessageReadDate
如果没有参考,我们仍然可以使用它,但是使用笛卡尔积
FROM Message m, MessageReadDate mr
在这种情况下,将发出交叉联接
见:
Hibernate报告的问题位于第一行:
final String jpqlQuery = "SELECT m FROM Message m LEFT JOIN MessageReadDate mr "...
在左JOIN语句中。在hql中,联接必须表示关系,例如
LEFT JOIN m.MessageReadDate mr // the m is referencing the MessageReadDate
如果没有参考,我们仍然可以使用它,但是使用笛卡尔积
FROM Message m, MessageReadDate mr
在这种情况下,将发出交叉联接
见:
如果您想在HQL中使用JOIN,那么您只能在
From
子句中提到的类的属性上使用它
它的意思是,在这一行中:
SELECT m FROM Message m LEFT JOIN MessageReadDate mr
hibernate检查MessageReadDate
是否定义为Message
类中的属性,该类在此处被视为路径。由于没有名为MessageReadDate
的内容,因此会引发异常
因此,要解决此问题,请在Message
类中添加MessageReadDate
类所需的属性,例如mrd
(您可以将关系设置为一对一或多对多等),然后使用如下查询:
SELECT m FROM Message m LEFT JOIN m.mrd
通过这种方式,我们告诉hibernate如何将消息与其相应的属性连接起来,这样hibernate就可以清楚地看到连接的路径。如果您想在HQL中使用连接,那么您只能在
From
子句中提到的类的属性上使用它
它的意思是,在这一行中:
SELECT m FROM Message m LEFT JOIN MessageReadDate mr
hibernate检查MessageReadDate
是否定义为Message
类中的属性,该类在此处被视为路径。由于没有名为MessageReadDate
的内容,因此会引发异常
因此,要解决此问题,请在Message
类中添加MessageReadDate
类所需的属性,例如mrd
(您可以将关系设置为一对一或多对多等),然后使用如下查询:
SELECT m FROM Message m LEFT JOIN m.mrd
通过这种方式,我们告诉hibernate如何将消息与其相应的属性连接起来,这样hibernate就可以清楚地看到连接的路径