休眠 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 连接错误的主要内容,如果未能解决你的问题,请参考以下文章
休眠错误-org.hibernate.hql.internal.ast.QuerySyntaxException
JPA 查询连接错误:org.hibernate.hql.internal.ast.QuerySyntaxException:连接所需的路径