【问题标题】:Hibernate NOT IN subquery on junction table联结表上的休眠 NOT IN 子查询
【发布时间】:2012-03-23 12:22:51
【问题描述】:

我正在尝试在 hibernate 中进行如下查询:

SELECT phone.* FROM phone WHERE phone.id NOT IN (SELECT phone_id FROM user_phone)

我有以下实体类:

@Entity
class User {
    @Id
    private Integer id;

    @ManyToMany
    private Set<Phone> phoneList;

}

还有电话类:

@Entity
class Phone {

    @Id
    private Integer id;

    private String description;

}

Hibernate 自动创建一个名为 user_phone 的联结表。现在我想选择所有没有被任何用户使用的手机。我只是不知道如何用 Hibernate 做到这一点。我尝试了以下方法:

Session session = (Session) entityManager.getDelegate();
Criteria criteria = session.createCriteria(Phone.class);

DetachedCriteria subCriteria = DetachedCriteria.forClass(User.class);
subCriteria.setProjection(Property.forName("phoneList"));

criteria.add(Subqueries.propertyNotIn("id", subCriteria))

但这会返回 id 与任何电话的 id 不同的所有用户。所以这不是我要找的。​​p>

有人知道怎么做吗?

【问题讨论】:

    标签: java sql hibernate


    【解决方案1】:
    Criteria criteria = session.createCriteria(Phone.class)
        .add(Subqueries.propertyNotIn("id", DetachedCriteria.forClass(User.class)
            .createAlias("phoneList", "phone")
            .setProjection(Property.forName("phone.id"))
        ));
    

    【讨论】:

      【解决方案2】:

      自从我来到这里寻找如何形成子查询而不是标准,我想知道其他人是否也会以同样的方式结束。

      既然我想出了如何用 HQL 编写查询,我想分享一下解决方案,以防万一:

      from phone p where p.id not in (select ph.id from User u join u.phoneList ph)

      在类似的情况下为我工作。希望对您有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-16
        • 1970-01-01
        • 2015-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-06
        相关资源
        最近更新 更多