当前位置: 首页 > 知识库问答 >
问题:

hibernate(HQL)中的内部连接问题

漆雕彦
2023-03-14

我使用的是Struts-Spring-Hibernate,我很难让我的HQL正确执行。

我有四个对象,objectA、objectB、objectC和objectD。对象A与对象B之间有一对多关系,它们之间的关系就像ObjectB与FK ObjectA之间的关系一样。Id。该模式在对象中延续,即对象B与对象C等有一对多关系。

我现在一直在做的是调用“从对象XVO到对象XId=?”来获取对象列表。我的应用程序变得越来越复杂,所以我需要做一些更复杂的HQL。

基本上我需要的是,考虑到ObjectBVO。objectBId我需要返回ObjectA中包含给定ObjectB的某些列,ObjectCs中属于给定ObjectB的某些列,以及ObjectCs中属于给定ObjectB的所有列。

这是我在Microsoft SQL Server中使用的SQL语句。它正在工作,希望能展示我的模型。

SELECT ObjectB.ObjectBID, ObjectB.ObjectBName, ObjectC.ObjectCDescription, 
ObjectD.*, ObjectA.ObjectAID
FROM ObjectB, ObjectC, ObjectD, ObjectA
WHERE ObjectB.ObjectBID = 2 
AND ObjectA.ObjectAID = ObjectB.ObjectAID
AND ObjectB.ObjectBID = ObjectC.ObjectBID
AND ObjectD.ObjectCID = ObjectC.ObjectCID

这是我试图用来返回列表的DAOimpl对象中的代码

List<ObjectDVO> objectDs;
try{
String hql = "SELECT ObjectBVO.objectBId, ObjectBVO.objectBName,
    ObjectCVO.objectCDescription, ObjectCVO.objectCId,"
+" ObjectAVO.objectAId, ObjectAVO.objectAName, ObjectDVO"
    +" FROM ObjectBVO, ObjectAVO, ObjectCVO, ObjectDVO"
    +" WHERE ObjectBVO.objectBId = ?"
+" AND ObjectAVO.objectAId = ObjectBVO.objectAId"
+" AND ObjectBVO.objectBId = ObjectCVO.objectBId"
+" AND ObjectDVO.objectCId = ObjectCVO.objectCId";
objectDs = getHibernateTemplate().find(hql, objectBID);
}

这只会抛出一个表示null的错误。我看过HQL文档和一些教程,但不清楚如何在多个VO对象上实现这一点。有人能帮忙吗?谢谢

共有1个答案

岳嘉容
2023-03-14

必须为实体指定别名,然后返回/使用这些别名。

此外,根据你的描述,你的实体之间应该有一对一/多对一的关联,但你没有这种关联。所有的ID都指向其他实体。

返回多个字段的查询不会返回ObjectDVO的实例。它将返回List

最后,VO实际上不是一个实体。你的实体不应该被命名为VO。这基本上就像在动物上附加一个水果后缀。

无论如何,如果您保持实体如图所示(您不应该这样做,而是引入关联),您的查询应该如下所示:

select b.objectBId, b.objectBName, c.objectCDescription, c.objectCId,
       a.objectAId, a.objectAName, d
from ObjectBVO b, ObjectAVO a, ObjectCVO c, ObjectDVO d
where b.objectBId = ?
and a.objectAId = b.objectAId
and b.objectBId = c.objectBId
and d.objectCId = c.objectCId

有了众多的联想,你可以简单地做到

select d from D d
inner join fetch d.c c
inner join fetch c.b b
inner join fetch b.a a

你会得到一个列表

String nameOfA = d.getC().getB().getA().getName();

最后一点:属性是类的一部分。因此命名objectAIdObjectA的ID是多余的。将其命名为idobjectA。getId()比objectA可读性强得多。getObjectAId()

 类似资料:
  • 如何在Hibernate中编写此SQL查询?我想使用Hibernate创建查询,而不是创建数据库。 我在SQLServer2008中创建了实体类, 我尝试用多种方法构建工作选择查询,但仍然不起作用。 也许实体有问题?

  • 我有两个由onetomany映射的实体类: 另一个 结果和表格如下: 现在,我正在尝试执行内部联接并获取fileinfo类型的列表: 我得到了这个错误 Struts检测到一个未处理的异常:Messages: org。冬眠hql。antlr。HqlBaseParser。恢复(Lantlr/RecognitionException;Lantlr/collections/impl/BitSet;)V文件

  • 问题内容: 如何在Hibernate中编写此SQL查询?我想使用Hibernate创建查询,而不是创建数据库。 我在SQLServer2008中创建了实体类, 我试图以多种方式构建有效的选择查询,但仍然无法正常工作。 实体有问题吗? 问题答案: 仅当实体之间存在关联时才能使用联接。您的Employee实体不应将名称为,类型为的字段映射到列。它应该与Team实体具有ManyToOne关联,并映射为J

  • 我有以下mysql查询: 我已经编辑了我的问题,以添加我正在使用的两个实体。第一个实体包含频率,我想要加入从另一个实体选择的项目。TFrequency表有一个不变的常量值。这个频率使用ID映射到tEXCELSMSTOSENDSchedule实体。但是,我希望从tfrequence中选择name,而不是映射的id。然后我用它来填充我的数据表。我需要创建第三个实体吗?我不知道这是如何工作的,我一直在尝

  • 我试图在一列内连接两个表。从数据库方面来看,没有映射,因为这是我不想讨论的事情。 我想使用内部联接执行HQL查询并检索角色对象/结果。 这是到目前为止我的hql 一场createQuery(“从角色作为角色内部加入参与作为角色上的参与。id=invention.roleid,其中invention.id=X”)。list(); 我看到在HQL上不可用。如何明确地告诉Hibernate仅加入此列。

  • 问题内容: 如何在Hibernate中编写此SQL查询?我想使用Hibernate创建查询,而不是创建数据库。 我在SQLServer2008中创建了实体类, 我试图以多种方式构建有效的选择查询,但仍然无法正常工作。 实体有问题吗? 问题答案: 连接只能在实体之间存在关联时使用。您的Employee实体不应将名称为,类型为的字段映射到列。它应该与Team实体具有ManyToOne关联,并映射为Jo