java - 是否可以获取 Hibernate sqlRestriction 的连接表的 SQL 别名?

标签 java hibernate orm collections criteria

我有一个 Person 类,它有一个 String 别名集合,表示该人可能使用的其他名称。例如,克拉克肯特可能有“超人”和“钢铁侠”的别名。德怀特霍华德还有一个外号“超人”。

@Entity
class Person {

  @CollectionOfElements(fetch=FetchType.EAGER)
  Set<String> aliases = new TreeSet<String>();

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

我想对所有化名为“超人”的人进行 hibernate 条件查询。

由于太长的原因无法在此处列出,我真的很想将其设为 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 是此条件的主表,而不是 Person_aliases。

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

我真的非常想避免硬编码“aliases2_”。

感谢您的宝贵时间!

最佳答案

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

crit.add(Restrictions.sqlRestriction(
    "{alias}.joinedEntity.property='something'"));

你需要做的是:

crit.createCriteria("joinedEntity").add(Restrictions.sqlRestriction(
    "{alias}.property='something'"));

这为我解决了类似的问题而无需使用 HQL

关于java - 是否可以获取 Hibernate sqlRestriction 的连接表的 SQL 别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2345419/

相关文章:

hibernate - 如何使用GORM事件正确更新一对多关联

java - BeanCreationException : Error creating bean with name 'entityManagerFactory'

python - peewee和python的外键关系

java - java `indexOf`对 `float[]`的使用

java - 如何使用 Java Stream 查找共享键的所有值的平均值?

java - 使用 Jpa 2.1 调用存储过程时出现 "Ordinal binding and Named binding"问题

python - 为什么我的 "def __str__(self)"函数在 Django 中不起作用

java - Cascade ALL 未按预期工作

java - 我使用过 Oracle10gDialect 但出现错误

java - SwipeListView 使用 NullPointerException