【问题标题】:Using HQL to select from joined tables having one to many relationship between them使用 HQL 从它们之间具有一对多关系的连接表中进行选择
【发布时间】:2012-05-20 20:12:30
【问题描述】:

我被这个休眠的东西困住了,不知道如何解决。请帮忙!

所以我有这两张表:

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>

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

谁能告诉我如何解决这个问题?

【问题讨论】:

  • 连接用于导航两个实体之间的关联。您的查询毫无意义。你真正想达到什么目标?你说你想要所有的职位描述,但是你的代码显示你想要一个List&lt;Position&gt;
  • 您好,我理解这种混淆,我正在尝试上面引用的查询,甚至不确定这是正确的。我现在已经用我真正想要实现的目标更新了这个问题。

标签: java hibernate hql hibernate-mapping


【解决方案1】:

如果你只想要这三列,那么 HQL 应该是

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

此查询将返回一个List&lt;Object[]&gt;,并且列表中的每个 Object 数组都将包含这三个元素。

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

select job from Job job
left join fetch job.position

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

HQL 的语法在reference documentation 中有示例,必读。

【讨论】:

  • 谢谢,这很有魅力,我将使用第二个查询,因为如果添加更多列会很有帮助,当然,我觉得这是更好的方法。
【解决方案2】:

我认为你可以从 Position 对象中获取乔布斯()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2021-07-22
    • 2014-08-09
    • 2012-06-21
    相关资源
    最近更新 更多