【问题标题】:Criteria subquery with not null不为空的条件子查询
【发布时间】:2011-12-05 11:14:19
【问题描述】:

我想将以下子查询转换为使用休眠子查询:

getCurrentSession().createQuery("from Employee where id in (select adminId from Department where adminId is not null)")
                   .list();
  • 员工:

    @ManyToOne
    @JoinColumn(name = "fk_department_id", nullable = true) 
    private Department department;
    
  • 部门:

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "fk_department_id")
    private Set<Employee> employees = new HashSet<Employee>(0);
    

谁能给我这个转换的例子,因为我读了一些例子,但我仍然无法弄清楚如何做到这一点。

【问题讨论】:

  • 顺便说一句,我最近在发布新问题时调整任何代码块时遇到了一个严重问题,我照常从我的 IDE 或文本文件中复制代码并突出显示代码,然后用代码按钮,但显示不好。
  • 那是因为您使用的是制表符而不是空格。
  • 你能告诉我你是如何重新格式化代码的,这样我以后就可以避免这样的事情了吗?
  • 在 Eclipse 中,我有用空格替换选项卡的设置,所以当我复制我的代码时,我不必什么都不做。在您的情况下,我刚刚删除了选项卡并插入了空格(在列表中,您可能需要输入 8 个空格而不是 4 个。)
  • 1. Preferences -&gt; Java -&gt; CodeStyle -&gt; Formatter -&gt; Edit -&gt; Indentation -&gt; Tab policy: Spaces only。我只是手动完成的 - 它只有几行,所以不是很痛苦:-)

标签: hibernate hibernate-criteria detachedcriteria


【解决方案1】:
Criteria c = session.createCriteria(Employee.class, "e");
DetachedCriteria dc = DetachedCriteria.forClass(Departemt.class, "d");
dc.add(Restrictions.isNotNull("d.adminId");
dc.setProjection(Projections.property("d.adminId"));
c.add(Subqueries.propertyIn("e.id", dc));

setProjection 调用使子查询仅返回 adminId 属性,而不是整个 Department 实体。 Subqueries.propertyIn 创建一个限制:被搜索员工的属性id 必须是子查询返回的结果集in

【讨论】:

  • 它工作得很好,谢谢,但你能否对最后两行提供一点解释,我找不到他们的文档。
猜你喜欢
  • 1970-01-01
  • 2012-12-04
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多