Hibernate 为什么在尝试构造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 " +

我正在使用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 " + 
            " 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;
那么为什么我不能引用“教室”属性呢


谢谢,-Dave

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
在这种情况下,将发出交叉联接

见:

小引用:

可以出现多个类,从而产生笛卡尔乘积或“交叉”联接

还可以使用联接将别名指定给关联的实体或值集合的元素。例如:


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就可以清楚地看到连接的路径