加入错误JPA和named_queries xml的路径

时间:2012-08-06 20:10:40

标签: java hibernate jpa

我对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。

2 个答案:

答案 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>