2012-05-12 53 views
1

我被困在這個Hibernate的東西,不知道如何弄清楚。請幫忙 !使用HQL從聯合表中選擇它們之間具有一對多關係

所以,我有這兩個表:

POSITION 
positionid(PK), description 

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

如何使用HQL在Hibernate中與它們對應的位置說明,以獲取所有的工作?

編輯:所以這就是我想實現:

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) 
    ......................... 
    ........................... 

有人能告訴我如何解決此問題,請?

+0

連接用於導航兩個實體之間的關聯。你的查詢沒有意義。你真的想實現什麼?你說你希望所有的工作都有他們的職位描述,但是你的代碼表明你想要一個'List '。 –

+0

您好,我理解這種混淆,我試着用上面引用的查詢,甚至不確定這是否正確。我現在已經更新了我真正想要實現的問題。 –

回答

5

如果你只想要這三根柱子,則HQL應該

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

這個查詢將返回一個List<Object[]>每個對象數組在列表中將包含這三個元素。

這將是更自然不過使用此查詢:

select job from Job job 
left join fetch job.position 

這將加載所有的工作與他們的位置。該查詢將返回一個List,並且您將能夠使用job.getId()job.getPosition().getDescription()job.getDescription()訪問您想要的三個信息。

HQL的語法用reference documentation中的示例進行了描述,這是一個必讀內容。

+0

謝謝,這個工作很喜歡魅力,我會和第二個查詢一起去,因爲如果添加更多的列,它會有幫助,當然,我覺得它是更好的方法。 –

0

我想你可以getJobs()從位置對象

相關問題