Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 连接错误JPA和命名查询xml所需的路径_Java_Hibernate_Jpa - Fatal编程技术网

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

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

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

您在查询中使用别名(
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>


谢谢。我来看看!非常感谢。我来看看!