我对JPA和Hibernate的这个错误感到很困惑。
这是Stack异常
2012-08-07 03:55:04,277 ERROR [org.hibernate.hql.PARSER] (HDScanner) Path expected for join!
2012-08-07 03:55:04,299 ERROR [org.hibernate.impl.SessionFactoryImpl] (HDScanner) Error in named query: getTotalCallReportsFromQuarter
org.hibernate.QueryException: Unable to resolve path [care.quarter], unexpected token [care] [SELECT count(noOfCallReports) FROM com.business.model.base.CareCallReport JOIN Relationships with CareCallReport.clientAccountNo=Relationships.clientAccountNo where UID = :UID and care.quarter = :quarter and care.year = :year]
这是我计划加入的两个实体:
CareCallReport.java
@Entity
@Table(name = "CARE_CALLREPORT")
public class ICareCallReport implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ClientAccountNo", nullable = false, length = 7)
private String clientAccountNo;
@Column(name = "NoOfCallReports", nullable = false, length = 11)
private int noOfCallReports;
@Column(name = "Quarter", nullable = false, length = 11)
private int quarter;
@Column(name = "QtrYear", nullable = false, length = 4)
private int year;
... Getters and Setters
另一个实体
ITRelationships.java
@Entity
@Table(name = "IT_RELATIONSHIPS")
public class ITRelationships implements Serializable {
@Id
@Column(name = "ClientID",nullable = false, length = 7)
private String clientID;
@Column(name = "ClientAccountNo", nullable = false, length = 7)
private String clientAccountNo;
@Id
@Column(name = "UID", nullable = false, length = 6)
private String UID;
@Column(name = "Quarter", nullable = false, length = 11)
private int quarter;
@Column(name = "QtrYear", nullable = false, length = 4)
private int year;
Getters and Setters
我写的JQL方法是这样的:
<access>FIELD</access>
<named-query name="getTotalCallReportsFromQuarter">
<query>
<![CDATA[
SELECT count(noOfCallReports)
FROM CareCallReport JOIN ITRelationships
with CareCallReport.clientAccountNo = ITRelationships.clientAccountNo
where UID = :uid
and care.quarter = :quarter
and care.year = :year
]]>
</query>
</named-query>
我做错了什么?这是我第一次接触JPA。
答案 0 :(得分:3)
您在查询中使用别名(icare
)而未对其进行定义。此外,只有在实体之间存在关联(OneToOne,OneToMany,ManyToOne或ManyToMany)时才可以进行连接。假设您没有,则查询应为
SELECT count(care.noOfCallReports)
FROM CareCallReport care, ITRelationships relationship
where relationship.UID = :uid
and care.quarter = :quarter
and care.year = :year
and care.clientAccountNo = relationship.clientAccountNo
HQL和关联在the Hibernate documentation中有详细描述。阅读它。
答案 1 :(得分:2)
您似乎忘记在查询中使用别名。
但我想再解释一下。使用JPA / Hibernate,您不只是将DB中的表映射到POJO(实体),您也可以映射关系。
如果我理解正确,IT_RELATIONSHIPS与CARE_CALLREPORT之间存在一对一的关系。在面向对象的术语中,ITRelationships引用了ICareCallReport。
ClientAccountNo实际上并不是IT_RELATIONSHIPS实体的属性,它只是对CARE_CALLREPORT实体的引用。
ITRelationships.java
@Entity
@Table(name = "IT_RELATIONSHIPS")
public class ITRelationships implements Serializable {
@Id
@Column(name = "ClientID",nullable = false, length = 7)
private String clientID;
@OneToOne
@JoinColumn(name="ClientAccountNo")
private ICareCallReport careCallReport;
....
现在查询变得更加简单了。记住这不是SQL,这是对象查询。
<named-query name="getTotalCallReportsFromQuarter">
<query>
<![CDATA[
SELECT itr.careCallReport.noOfCallReports
FROM ITRelationships itr
where itr.UID = :uid
and itr.careCallReport.quarter = :quarter
and itr.careCallReport.year = :year
]]>
</query>
</named-query>