有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

连接错误JPA和命名查询xml所需的java路径

我对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: 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) 个答案

  1. # 1 楼答案

    您似乎忘记了在查询中使用别名

    但我还是想再解释一下。使用JPA/Hibernate,您不仅可以将DB中的表映射到POJO(实体),还可以映射关系。

    如果我理解正确,从it关系到护理报告之间存在一对一的关系。在面向对象的术语中,ITRelationships引用了iCalReport。

    此外,ClientAccountNo实际上不是IT\u RELATIONSHIPS实体的属性,它只是对CARE\u 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>
    
  2. # 2 楼答案

    您在查询(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中有很好的描述。读一下