休眠 HQL 连接错误

Posted

技术标签:

【中文标题】休眠 HQL 连接错误【英文标题】:hibernate HQL join error 【发布时间】:2012-07-03 00:16:04 【问题描述】:

我正在尝试让我的 HQL 查询正常工作,但我已经卡住了一段时间,决定在这里提问。

我不断收到“预期加入的路径!”

所以我有 2 个要查询的表,我已经有了 SQL 查询。

这些是我的 xml 映射

Kamer.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="model.Kamer" table="kamer">
    <id name="kamerid">
        <generator class="identity"/>
    </id>
    <property name="hotelid"/>
    <property name="kamertypeid" />
    <property name="status"      />
</class>
</hibernate-mapping>


Reservatie.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="model.Reservatie" table="reservatie">
    <id name="reservatieID">
        <generator class="identity"/>
    </id>
    <property name="klantID"/>
    <property name="kamertypeID" />
    <many-to-one name="kamerID" class="model.Kamer" />
    <property name="hotelID"      />
    <property name="verblijfsformuleID"  />
    <property name="verblijfsperiodeID"    />
    <property name="betalingsID" />
    <property name="gastID"     />
    <property name="kredietkaartID"/>
    <property name="start_datum"      />
    <property name="eind_datum"   />
    <property name="reservatie_datum"   />
    <property name="tijdige_annulatie"   />
    <property name="check_in_datum"   />
    <property name="check_uit_datum"   />
</class>
</hibernate-mapping>

这是我的 2 个 java 类

package model;

public class Kamer 

public int kamerid;
public int hotelid;
public int kamertypeid;
public String status;

public Kamer() 


public Kamer(int kamerid, int hotelid, int kamertypeid, String status) 
    this.kamerid = kamerid;
    this.hotelid = hotelid;
    this.kamertypeid = kamertypeid;
    this.status = status;


public String getStatus() 
    return status;


public void setStatus(String status) 
    this.status = status;


public int getKamerid() 
    return kamerid;


public void setKamerid(int kamerid) 
    this.kamerid = kamerid;


public int getHotelid() 
    return hotelid;


public void setHotelid(int hotelid) 
    this.hotelid = hotelid;


public int getKamertypeid() 
    return kamertypeid;


public void setKamertypeid(int kamertypeid) 
    this.kamertypeid = kamertypeid;



@Override
public String toString() 
    return "Kamer" +
            "kamerid=" + kamerid +
            ", hotelid=" + hotelid +
            ", kamertypeid=" + kamertypeid +
            ", status='" + status + '\'' +
            '';


package model;
import java.util.Date;

public class Reservatie 

public int reservatieID;
public int klantID;
public int kamertypeID;
public int kamerID;
public int hotelID;
public int verblijfsformuleID;
public int verblijfsperiodeID;
public int betalingsID;
public int gastID;
public int kredietkaartID;
public Date start_datum;
public Date eind_datum;
public Date reservatie_datum;
public String tijdige_annulatie;
public Date check_in_datum;
public Date check_uit_datum;


public Reservatie()  

public Reservatie(int reservatieID,int klantID, int kamertypeID, int kamerID, int hotelID,       int verblijfsformuleID, int verblijfsperiodeID, int betalingsID, int gastID, int kredietkaartID, Date start_datum, Date eind_datum, Date reservatie_datum, String tijdige_annulatie, Date check_in_datum, Date check_uit_datum) 
    this.reservatieID = reservatieID;
    this.klantID = klantID;
    this.kamertypeID = kamertypeID;
    this.kamerID = kamerID;
    this.hotelID = hotelID;
    this.verblijfsformuleID = verblijfsformuleID;
    this.verblijfsperiodeID = verblijfsperiodeID;
    this.betalingsID = betalingsID;
    this.gastID = gastID;
    this.kredietkaartID = kredietkaartID;
    this.start_datum = start_datum;
    this.eind_datum = eind_datum;
    this.reservatie_datum = reservatie_datum;
    this.tijdige_annulatie = tijdige_annulatie;
    this.check_in_datum = check_in_datum;
    this.check_uit_datum = check_uit_datum;


public int getKlantID() 
    return klantID;


public void setKlantID(int klantID) 
    this.klantID = klantID;


public int getReservatieID() 
    return reservatieID;


public void setReservatieID(int reservatieID) 
    this.reservatieID = reservatieID;


public int getKamertypeID() 
    return kamertypeID;


public void setKamertypeID(int kamertypeID) 
    this.kamertypeID = kamertypeID;


public int getKamerID() 
    return kamerID;


public void setKamerID(int kamerID) 
    this.kamerID = kamerID;


public int getHotelID() 
    return hotelID;


public void setHotelID(int hotelID) 
    this.hotelID = hotelID;


public int getVerblijfsformuleID() 
    return verblijfsformuleID;


public void setVerblijfsformuleID(int verblijfsformuleID) 
    this.verblijfsformuleID = verblijfsformuleID;


public int getVerblijfsperiodeID() 
    return verblijfsperiodeID;


public void setVerblijfsperiodeID(int verblijfsperiodeID) 
    this.verblijfsperiodeID = verblijfsperiodeID;


public int getBetalingsID() 
    return betalingsID;


public void setBetalingsID(int betalingsID) 
    this.betalingsID = betalingsID;


public int getGastID() 
    return gastID;


public void setGastID(int gastID) 
    this.gastID = gastID;


public int getKredietkaartID() 
    return kredietkaartID;


public void setKredietkaartID(int kredietkaartID) 
    this.kredietkaartID = kredietkaartID;


public Date getStart_datum() 
    return start_datum;


public void setStart_datum(Date start_datum) 
    this.start_datum = start_datum;


public Date getEind_datum() 
    return eind_datum;


public void setEind_datum(Date eind_datum) 
    this.eind_datum = eind_datum;


public Date getReservatie_datum() 
    return reservatie_datum;


public void setReservatie_datum(Date reservatie_datum) 
    this.reservatie_datum = reservatie_datum;


public String getTijdige_annulatie() 
    return tijdige_annulatie;


public void setTijdige_annulatie(String tijdige_annulatie) 
    this.tijdige_annulatie = tijdige_annulatie;


public Date getCheck_in_datum() 
    return check_in_datum;


public void setCheck_in_datum(Date check_in_datum) 
    this.check_in_datum = check_in_datum;


public Date getCheck_uit_datum() 
    return check_uit_datum;


public void setCheck_uit_datum(Date check_uit_datum) 
    this.check_uit_datum = check_uit_datum;


@Override
public String toString() 
    return "Reservatie" +
            "reservatieID=" + reservatieID +
            ", klantID=" + klantID +
            ", kamertypeID=" + kamertypeID +
            ", kamerID=" + kamerID +
            ", hotelID=" + hotelID +
            ", verblijfsformuleID=" + verblijfsformuleID +
            ", verblijfsperiodeID=" + verblijfsperiodeID +
            ", betalingsID=" + betalingsID +
            ", gastID=" + gastID +
            ", kredietkaartID=" + kredietkaartID +
            ", start_datum=" + start_datum +
            ", eind_datum=" + eind_datum +
            ", reservatie_datum=" + reservatie_datum +
            ", tijdige_annulatie='" + tijdige_annulatie + '\'' +
            ", check_in_datum=" + check_in_datum +
            ", check_uit_datum=" + check_uit_datum +
            '';


这是我的 HQL 部分

import model.Reservatie;
import org.hibernate.Query; 
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import persistentie.HibernateUtil;
import model.Kamer;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;


@SuppressWarnings("ALL")
public class testKamer 
public static void main(String[] args) throws Exception

    SessionFactory factory = HibernateUtil.getSessionFactory();
    Session session = factory.getCurrentSession();

    Transaction tx = session.beginTransaction();


    String HQL_QUERY = "SELECT k FROM Kamer k LEFT JOIN Reservatie r with k.kamerid = r.kamerID";
    Query query = session.createQuery(HQL_QUERY);
    List result = query.list();
    for(Iterator it = result.iterator();it.hasNext();) 
        Kamer kamer = (Kamer) it.next();
        System.out.println("Kamer: "+kamer.kamerid);
    


这里也是原始的 SQL 查询

     SELECT *
     FROM kamer
     LEFT JOIN reservatie
     ON kamer.kamerid=reservatie.kamerid and kamer.kamertypeid = reservatie.kamertypeid and kamer.hotelid = reservatie.hotelid
     where not reservatie.verblijfsperiodeid = 2 or reservatie.kamerid is null;

欢迎任何帮助, 提前致谢!

【问题讨论】:

究竟是什么问题? :S 抱歉完全忘记提了,来晚了。我不断收到“预期加入的路径!” 我猜带有相关来源的堆栈跟踪会有所帮助 问题不在于(仅)在于 HQL。问题是您的实体之间没有任何关联。您存储其他实体的 ID,而不是存储对它们的引用。阅读 Hibernate 关于关联的文档,并开始使用它们,因为只有关联才能进行连接。 所以我的两个 xml 映射都是错误的,你是说?我对所有这些东西都很陌生,所以我想通过在 kamer.hbm.xml 中添加多对一属性来建立关联?你认为你可以突出问题所在,以便我可以更具体地搜索吗?在此先感谢! 【参考方案1】:

我认为您的查询应该是

String HQL_QUERY = "SELECT k FROM reservatie r right join Kamer k";

String HQL_QUERY = "SELECT k FROM reservatie r join Kamer k";

【讨论】:

可悲的是,它不起作用并给出相同的错误,这是:线程“main”中的异常 org.hibernate.hql.ast.QuerySyntaxException: Path expected for join! [SELECT k FROM model.Kamer k LEFT JOIN reservatie r with k.kamerid = r.kamerID]

以上是关于休眠 HQL 连接错误的主要内容,如果未能解决你的问题,请参考以下文章

HQL查询中的休眠表未映射错误

休眠错误-org.hibernate.hql.internal.ast.QuerySyntaxException

JPA 查询连接错误:org.hibernate.hql.internal.ast.QuerySyntaxException:连接所需的路径

HQL 错误:连接的预期路径

HQL 错误:连接的预期路径

Hibernate JPQL/HQL:聚合函数的错误显示错误的表/实体连接两次(仅使用 HSQLDB)的结果?