簡體   English   中英

使用HQL從連接表之間選擇一對一關系

[英]Using HQL to select from joined tables having one to many relationship between them

我一直沉迷於休眠狀態,不知道如何解決。 請幫忙 !

所以我有兩個表:

POSITION
positionid(PK), description

JOB
jobid(PK),positionid(FK),description

如何在Hibernate中使用HQL來獲取所有作業及其相應的位置描述?

編輯:所以這是我想要實現的:

JOBID     POSITION.DESCRPTION     JOB.DESCRIPTION
  1        Teacher                Science Teacher
  2        Coach                  Football Coach

以此類推,對於JOB表中的所有作業。 我試圖弄清楚這將是HQL。

到目前為止,我已經整理了以下代碼:

position.hbm.xml

<hibernate-mapping>
  <class name="com.XXXX.model.Position" table="POSITION">
   <id name="positionID" type="int" column="POSITIONID" >
   <generator class="assigned"/>
  </id>

  <property name="description">
   <column name="DESCRIPTION" />
  </property>

  <set name="jobs">
    <key column="positionID" />
    <one-to-many class="com.XXXX.model.Job" />
  </set>

 </class>
</hibernate-mapping>

job.hbm.xml

<hibernate-mapping>

  <class name="com.XXXX.model.Job" table="JOB">
   <id name="jobID" type="int" column="JOBID" >
   <generator class="assigned"/>
  </id>

  <property name="description">
   <column name="DESCRIPTION" />
  </property>

  <many-to-one name="position" class="com.XXXX.model.Position" column="positionID" />

 </class>
</hibernate-mapping>

Position.java

public class Position {

    private int positionID;
    private String description;
    private Set<Job> jobs = new HashSet<Job>();

    // Getters and Setters for all the above three follows...

}

Job.java

public class Job {

    private int jobID;
    private String description;
    private Position position;

    // Getters and Setters for all the above three follows...
}

現在在我的代碼中使用

session.createQuery("from Position as p left join p.positionID as pid").list();

我知道它不完全正確,並且出現以下錯誤:

java.lang.NullPointerException
    at org.hibernate.hql.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:317)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.joinElement(HqlSqlBaseWalker.java:3268)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3060)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2938)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:544)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
    .........................
    ...........................

有人可以告訴我如何解決這個問題嗎?

如果只需要這三列,則HQL應該是

select job.id, position.decription, job.description 
from Job job
left join job.position position

該查詢將返回List<Object[]> ,列表中的每個Object數組將包含這三個元素。

但是使用以下查詢會自然得多:

select job from Job job
left join fetch job.position

這將加載所有作業的位置。 該查詢將返回一個List,您將能夠使用job.getId()job.getPosition().getDescription()job.getDescription()來訪問三個信息。

必須閱讀的參考文檔中的示例介紹了HQL的語法。

我認為您只能從Position對象獲取getJobs()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM