我正在躲开How to join tables in unidirectional many-to-one condition?。
如果你有两个班级:
class A {
@Id
public Long id;
}
class B {
@Id
public Long id;
@ManyToOne
@JoinColumn(name = "parent_id", referencedColumnName = "id")
public A parent;
}
B - > A是多对一的关系。我知道我可以在A中添加一个B集合,但是我不希望这种关联。
所以我的实际问题是,是否有创建SQL查询的HQL或Criteria方法:
select * from A left join B on (b.parent_id = a.id)
这将检索具有引用A的每个B记录的笛卡尔积的所有A记录,并且将包括没有B引用它们的A记录。
如果您使用:
from A a, B b where b.a = a
然后它是一个内连接,你没有收到没有B引用它们的A记录。
如果没有两个查询,我还没有找到一个很好的方法,所以任何不到的东西都会很棒。
感谢。
答案 0 :(得分:2)
我已经用你发布的内容做了一个例子,我认为这可行:
HQL中的 select a,b from B as b left outer join b.parent as a
。
我必须找到一种“标准”方式来做到这一点。
答案 1 :(得分:1)
您可以通过指定fetch属性来执行此操作。
(10)fetch(可选)通过顺序选择在外连接提取和提取之间进行选择。
您可以在Chapter 6. Collection Mapping找到它,向下滚动到: 6.2。映射集合
修改强>
我在你的问题评论中读到你想要一种执行原始SQL查询的方法吗?这里有一个可能感兴趣的参考:
Chapter 13 - Native SQL Queries
如果你想通过HQL实现这一目标:
Chapter 11. HQL: The Hibernate Query Language
在第11章中,您想向下滚动到 11.3。关联和加入。
IQuery q = session.CreateQuery(@"from A as ClassA left join B as ClassB");
但我想ClassB需要成为ClassA的成员。进一步的重新分配应有所帮助。
另一件可能对您有用的事情是named queries:
<query name="PeopleByName">
from Person p
where p.Name like :name
</query>
从代码中调用此查询,如下所示:
using (var session = sessionFactory.OpenSession())
using (var tx = session.BeginTransaction()) {
session.GetNamedQuery("PeopleByName")
.SetParameter("name", "ayende")
.List();
tx.Commit();
}
请参阅Ayende的参考链接,他会更深入地解释它。