【问题标题】:Using "Select New" in HQL with join complaining "Path expected for join"在 HQL 中使用“选择新”并加入抱怨“预期加入的路径”
【发布时间】:2014-08-20 20:10:06
【问题描述】:

我有 2 个相关的实体类,并且想定义另一个非实体类,它只包含 2 个实体类,以便我可以使用 HQL 通过 Join 加载 2 个实体类。以下是代码:

@Entity
@Table(name = "Conversation", schema = "aaa", catalog = "xxx")
public class Conversation implements Serializable {

    private String conversationGuid;

...
}

@Entity
@Table(name = "Ticket", schema = "dbo", catalog = "MyTime")
public class Ticket implements Serializable {

    private String ticketGuid;

    private String conversationGuid;
...

}

非实体 POJO:

public class Conversation_Ticket {
    private Conversation convo;
    private Ticket ticket;

    public Conversation_Ticket(Conversation convo, Ticket ticket) {
        super();
        this.convo = convo;
        this.ticket = ticket;
    }   
}

DAO 进行 HQL 查询:

Configuration cfg = new Configuration().addFile("/Users/csi/git/mytime-acr/src/main/resources/Conversation_Ticket.hbm.xml");

Query query = getSession().createQuery(
        "select new Conversation_Ticket(convo, tic)"
        + "from Conversation as convo left outer join fetch Ticket as tic on convo.Conversation_GUID = tic.Conversation_GUID where agentGuidCurrent = :agentGuid and workState = :workState");

query.setParameter("agentGuidCurrent", agentGuid);
query.setParameter("workState", workState);
List list = query.list();

当调用 createQuery() 时,它基本上会抛出以下异常: org.hibernate.hql.internal.ast.QuerySyntaxException: 路径需要加入! [从 com.cs.mytime.acr.model.Conversation 中选择新的 Conversation_Ticket(convo, tic) 作为 convo left outer join fetch Ticket as tic on convo.Conversation_GUID = tic.Conversation_GUID where agentGuidCurrent = :agentGuid and workState = :workState]

似乎 Hibernate 根本无法识别 Conversation_Ticket POJO,并期望 Conversation 和 Ticket 之间存在某种对象级别的关系。

Conversation_Ticket.hbm.xml 定义如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping>
    <import class="com.cs.mytime.acr.model.aggregate.Conversation_Ticket" />
</hibernate-mapping>

我确实尝试将 Conversation_Ticket.hbm.xml 作为映射资源放在 hibernate.cfg.xml 中,如下所示:

<mapping resource="/Users/csi/git/mytime-acr/src/main/resources/Conversation_Ticket.hbm.xml"/>

但它抱怨找不到 Conversation_Ticket.hbm.xml,即使我在环境的 CLASSPATH 中定义了 /Users/csi/git/mytime-acr/src/main/resources。

感谢任何可以给我一些关于如何解决这个问题的指示。谢谢。

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    你有一个非常特殊的目录布局。假设 src 是 Eclipse 中的源文件夹,它会将所有非 Java 文件复制到 classes 或 bin 目录(或您为编译的类选择的任何目录名称),Conversation_Ticket.hbm.xml 应该直接在 @987654323 下@,因为你告诉 Hibernate 从 classpath 的根目录加载它:

    cfg.addResource("Conversation_Ticket.hbm.xml");
    

    如果你把它放在main/resources中,加载它的代码应该是

    cfg.addResource("main/resources/Conversation_Ticket.hbm.xml");
    

    为什么不使用自己的包层次结构,并因此使用以下目录树:

    src
      com
        rcook
          myapp
    

    【讨论】:

      猜你喜欢
      • 2013-04-27
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 2022-12-11
      • 2018-06-21
      • 1970-01-01
      相关资源
      最近更新 更多