【发布时间】:2011-01-21 16:07:25
【问题描述】:
我有一个 Person 类,它有一个 String 别名集合,表示该人可能经过的其他名称。例如,克拉克肯特可能有别名“超人”和“钢铁侠”。德怀特霍华德还有一个别名“超人”。
@Entity
class Person {
@CollectionOfElements(fetch=FetchType.EAGER)
Set<String> aliases = new TreeSet<String>();
Hibernate 在我的数据库中创建两个表,Person 和 Person_aliases。 Person_aliases 是一个包含列 Person_id 和元素的连接表。假设 Person_aliases 有以下数据
--------------------------------
| Person_id | element |
--------------------------------
| Clark Kent | Superman |
| Clark Kent | Man of Steel |
| Dwight Howard | Superman |
| Bruce Wayne | Batman |
--------------------------------
我想对所有别名为“超人”的人进行休眠条件查询。
由于此处列出的原因太长,我真的很想将其设为 Criteria 查询,而不是 HQL 查询(除非可以在 Criteria 对象上添加 HQL 限制,在这种情况下我会全力以赴)或原始 SQL 查询。因为根据How do I query for objects with a value in a String collection using Hibernate Criteria?,不可能使用 CriteriaAPI 引用值类型集合的元素,所以我想我会在我的条件对象上添加一个 SqlRestriction。
Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.sqlRestriction("XXXXX.element='superman'");
希望 Hibernate 会创建类似的 SQL 语句
select *
from
Person this_
left outer join
Person_aliases aliases2_
on this_.id=aliases2_.Person_id
where
XXXXX.element='superman'
但是,我需要在 SQL 查询中使用 Person_aliases 表的表别名填写 XXXXX,在本例中为“aliases2_”。我注意到如果我需要对 Person 表别名的引用,我可以使用 {alias}。但这不起作用,因为 Person 是此 Criteria 的主表,而不是 Person_aliases。
我应该为 XXXXX 填写什么?如果没有像 {alias} 这样好的替代令牌,那么有没有办法让我休眠告诉我该别名将是什么?我注意到一个名为 generateAlias() org.hibernate.util.StringHelper 类的方法。这会帮助我预测别名是什么吗?
我真的非常想避免硬编码“aliases2_”。
感谢您的宝贵时间!
【问题讨论】:
标签: java hibernate orm collections criteria