当前位置: 首页 > 面试题库 >

是否可以为Hibernate sqlRestriction获取联接表的SQL别名?

商经业
2023-03-14
问题内容

我有一个Person类,该类具有别名的String集合,这些别名表示person可能通过的其他名称。例如,克拉克·肯特(Clark
Kent)可能有别名“超人”和“钢铁侠”。德怀特·霍华德(Dwight Howard)的别名为“超人”。

@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查询。自从根据我如何使用hibernate条件在String集合中查询具有值的对象以来?使用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_”。

谢谢你的时间!


问题答案:

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

from Person p where :alias in elements(p.aliases)


 类似资料:
  • 问题内容: 我想获取所有Pythons关键字作为字符串的列表。如果我可以为内置函数做类似的事情,那也将很漂亮。 像这样的东西: 问题答案: 您询问了有关 语句的信息 ,同时在输出示例中显示了 关键字 。 如果您在寻找 关键字 ,它们都列在模块中: 从文档: 包含为解释程序定义的所有关键字的序列。如果将任何关键字定义为仅在特定语句生效时才处于活动状态,则这些关键字也将包括在内。

  • 问题内容: 有没有一种方法可以给Oracle 11g中的子查询一个别名,例如: 否则,有一种方法可以基于client_ref_id加入两个子查询。我意识到有一个自我连接,但是在我正在自我连接上运行的数据库上可能要花5分钟才能完成(我正在运行的实际查询中有一些额外的逻辑,但是我确定了自我连接是什么引起问题)。各个子查询仅需花费几秒钟即可完成。自联接查询看起来像: 问题答案: 您可以使用Oracle的

  • 问题内容: jQuery中是否有一种方法可以从现有元素中获取所有CSS并将其应用于另一个元素而无需列出所有元素? 我知道如果它们是带有的样式属性都可以,但是我所有的样式都在外部样式表中。 问题答案: 迟了几年,但是这里有一个可以同时检索内联样式和外部样式的解决方案: 将jQuery对象传递给,它将返回一个对象,然后您可以将其插回jQuery的,例如: :)

  • 问题内容: 我想抢先获取要在中加载的网页的HTML代码,使用正则表达式解析它,并仅显示所需的HTML代码,同时让该网页仍然认为它已加载了所有内容。 有什么方法可以通过或类似方法来做到这一点? 编辑:我尝试过此: 该接口永远不会被调用 问题答案: 不得不使用HttpClient。无需Cookie,只需解析html:

  • 我有一个简单的Select语句,它从2个MySQL表返回数据,运行良好。我现在需要从第三个相关表返回一些数据,但不确定如何做到这一点。 这是我当前的SQL查询 现在需要从wp_postmeta表中获取值,其中wp_postmeta表中的_thumbnail_id的值与wp_postmeta表中的post_id值匹配,并且meta_key值=_wp_attached_file。 下面是wp_post

  • 问题内容: 我正在从另一个来源接收ZipInputStream,并且需要将第一项的InputStream提供给另一个来源。 我希望能够在不将临时文件保存在设备上的情况下执行此操作,但是,我知道获取单个条目的InputStream的唯一方法是通过ZipFile.getInputStream(entry),并且因为我有一个ZipInputStream而不是ZipFile , 这是不可能的。 所以我最好