是否有可能获得Hibernate sqlRestriction的连接表的SQL别名?

Jas*_*vak 12 java collections orm hibernate criteria

我有一个Person类,它有一个别名的String集合,表示人可能经历的其他名称.例如,克拉克肯特可能有别名"超人"和"钢铁侠".德怀特霍华德也有别名"超人".

@Entity
class Person {

  @CollectionOfElements(fetch=FetchType.EAGER)
  Set<String> aliases = new TreeSet<String>();
Run Code Online (Sandbox Code Playgroud)

Hibernate在我的数据库中创建了两个表,Person和Person_aliases.Person_aliases是一个包含Person_id和element列的连接表.假设Person_aliases具有以下数据

--------------------------------
| Person_id     | element      |
--------------------------------
| Clark Kent    | Superman     |
| Clark Kent    | Man of Steel |
| Dwight Howard | Superman     |
| Bruce Wayne   | Batman       |
--------------------------------
Run Code Online (Sandbox Code Playgroud)

我想为所有使用"超人"别名的人制作一个hibernate Criteria查询.

由于这里列出的原因太长,我真的想把它作为Criteria查询,而不是HQL查询(除非可以在Criteria对象上添加HQL限制,在这种情况下我可以全部听到)或者是原始的SQL查询.因为根据如何使用Hibernate Criteria在String集合中查询具有值的对象?使用CriteriaAPI引用值类型集合的元素是不可能的,我以为我会在我的条件对象上添加一个SqlRestriction.

Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.sqlRestriction("XXXXX.element='superman'");
Run Code Online (Sandbox Code Playgroud)

希望Hibernate能像这样创建一个SQL语句

    select *
from
    Person this_ 
left outer join
    Person_aliases aliases2_ 
        on this_.id=aliases2_.Person_id 
where
    XXXXX.element='superman' 
Run Code Online (Sandbox Code Playgroud)

但是,我需要在SQL查询中使用Person_aliases表的表别名填充XXXXX,在这种情况下,它将是'aliases2_'.我注意到如果我需要引用Person表别名,我可以使用{alias}.但这不起作用,因为Person是此Criteria的主表,而不是Person_aliases.

我要为XXXXX填写什么?如果没有像{alias}这样的好的替代令牌,那么我有没有办法让hibernate告诉我该别名会是什么?我注意到一个名为generateAlias()org.hibernate.util.StringHelper类的方法.这有助于我预测别名会是什么吗?

我真的非常想避免硬编码'aliases2_'.

谢谢你的时间!

pst*_*ton 10

正如xmedeko所暗示的,当你想做的时候:

crit.add(Restrictions.sqlRestriction(
    "{alias}.joinedEntity.property='something'"));
Run Code Online (Sandbox Code Playgroud)

你需要改为:

crit.createCriteria("joinedEntity").add(Restrictions.sqlRestriction(
    "{alias}.property='something'"));
Run Code Online (Sandbox Code Playgroud)

这样就解决了类似的问题而不需要使用HQL


Pas*_*ent 4

Criteria API 似乎不允许查询元素集合,请参阅HHH-869(仍处于开放状态)。因此,要么尝试建议的解决方法(我没有这样做),要么切换到 HQL。以下 HQL 查询可以工作:

from Person p where :alias in elements(p.aliases)
Run Code Online (Sandbox Code Playgroud)