0

このエラーで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]

これが私が参加することを計画した2つのエンティティです:

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に触れたのはこれが初めてです。

4

2 に答える 2

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と関連付けについては、Hibernateのドキュメントで詳しく説明されています。それを読んで。

于 2012-08-06T20:27:50.267 に答える
2

クエリでエイリアスを使用するのを忘れたようです。

しかし、もう一度説明したいと思います。JPA / Hibernateを使用すると、DB内のテーブルをPOJO(エンティティ)にマップするだけでなく、リレーションシップもマップします。

私がそれを正しく理解していれば、IT_RELATIONSHIPSからCARE_CALLREPORTへの1対1の関係があります。オブジェクト指向の用語では、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>
于 2012-08-06T20:49:10.720 に答える