gpt4 book ai didi

java - 使用 HQL 从它们之间具有一对多关系的连接表中进行选择

转载 作者:行者123 更新时间:2023-11-29 08:06:54 25 4
gpt4 key购买 nike

我被这个 Hibernate 问题困住了,不知道如何解决。请帮忙!

所以我有这两张表:

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。

到目前为止,我已经整理了以下代码:

位置.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>

工作.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>

位置.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[]>并且列表中的每个对象数组都将包含这三个元素。

但是使用这个查询会更自然:

select job from Job job
left join fetch job.position

这将加载所有作业及其位置。该查询将返回一个列表,您将能够使用 job.getId() 访问您想要的三个信息。 , job.getPosition().getDescription() , 和 job.getDescription() .

HQL 的语法在 reference documentation 中通过示例进行了描述。 ,必读。

关于java - 使用 HQL 从它们之间具有一对多关系的连接表中进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10564773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com