org.hibernate.QueryException:无法解析路径,意外令牌[尝试使用左连接]

时间:2018-08-11 10:26:08

标签: java hibernate join left-join hql

我创建了2个实体类:

package entities;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "fr")
public class FR {
    @Id
    @Column(name = "id")
    private String id;
    @Column(name = "pid")
    private String pId;
    @Column(name = "pname")
    private String pName;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getpId() {
         return pId;
    }

    public void setpId(String pId) {
        this.pId = pId;
    }

    public String getpName() {
        return pName;
    }

    public void setpName(String pName) {
        this.pName = pName;
    }
}

package entities;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "ar")
public class AR {
    @Id
    @Column(name = "id")
    private String id;
    @Column(name = "value1")
    private String value1;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getValue1() {
        return value1;
    }

    public void setValue1(String value1) {
        this.value1 = value1;
    }
}

我正在尝试加入这些表以获取记录。

Query qry = session.createQuery("from FR left join AR on FR.pId = AR.id where FR.id=123 or FR.pId=123");

但出现异常:

org.hibernate.QueryException: Unable to resolve path [FR.id], unexpected token [FR] [from entities.FR left join AR on FR.pId = AR.id where FR.id=123 or FR.pId=123]

当我从查询中删除 FR

Query qry = session.createQuery("from FR left join AR on FR.pId = AR.id where id=123 or pId=123");

获得另一个例外:

org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [from entities.FR left join AR on FR.pId = AR.id where id=123 or pId=123]

我正处于Hibernate的学习阶段,不知道现在该怎么做。

如果您还有关于 Left Join或其他Joins 的其他信息,也请分享。

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/examples?zeroDateTimeBehavior=convertToNull</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">Root#123</property>
    <property name="hibernate.show_sql">true</property>
    <mapping class="entities.FR"/>
    <mapping class="entities.AR"/>
  </session-factory>
</hibernate-configuration>

主班

package hibernate.joins;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;


public class HibernateJoins {
    public static void main(String[] args) {
        SessionFactory sessionFactory = getSessionFactory();
        Session session = sessionFactory.openSession();
        Query qry = session.createQuery("from FR left join AR on FR.pId = AR.id and ( FR.id=123 or FR.pId=123 )");
        List list = qry.list();
        list.forEach(System.out::println);
        session.close();
        sessionFactory.close();
    }

    public static SessionFactory getSessionFactory () {
        SessionFactory sessionFactory = new Configuration().configure("configurations/hibernate.cfg.xml").buildSessionFactory();
        return sessionFactory;
    }
}

1 个答案:

答案 0 :(得分:0)

由于您在查询中使用 ON 子句,因此,不能单独使用 where 子句。只需继续使用 AND OR 子句(以适用者为准)

相关问题