Java 连接错误JPA和命名查询xml所需的路径
我对JPA和Hibernate的错误感到非常困惑 这里是堆栈异常Java 连接错误JPA和命名查询xml所需的路径,java,hibernate,jpa,Java,Hibernate,Jpa,我对JPA和Hibernate的错误感到非常困惑 这里是堆栈异常 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: getTotalCallReports
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。您在查询中使用别名(
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和关联。阅读它。您在查询中使用别名(
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和关联。请阅读。您似乎忘记了在查询中使用别名 但我还是想再解释一下。使用JPA/Hibernate,您不仅可以将DB中的表映射到POJO(实体),还可以映射关系。 如果我理解正确的话,从it关系到CARE报告之间存在一对一的关系。在面向对象的术语中,ITRelationships引用了iCalReport。 此外,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>
您似乎忘记了在查询中使用别名 但我还是想再解释一下。使用JPA/Hibernate,您不仅可以将DB中的表映射到POJO(实体),还可以映射关系。 如果我理解正确的话,从it关系到CARE报告之间存在一对一的关系。在面向对象的术语中,ITRelationships引用了iCalReport。 此外,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>
谢谢。我来看看!非常感谢。我来看看!