[英]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.