Java 如何在Hibernate中选择没有子对象的父对象?

Java 如何在Hibernate中选择没有子对象的父对象?,java,hibernate,one-to-many,Java,Hibernate,One To Many,我有以下实体,父对象和子对象,父对象可能没有子对象。如何选择在hibernate中没有孩子的家长?它类似于SQL中的notexisting子句。以下是我的实体: 我的问题是: 我确信我的条件是不正确的,但我找不到这种查询的正确方式。任何帮助都将不胜感激 要测试属性是否为null,请使用isNull。。。改变 Criteria criteria = session.createCriteria(Parent.class) .add(Restrictions.eq("childr

我有以下实体,父对象和子对象,父对象可能没有子对象。如何选择在hibernate中没有孩子的家长?它类似于SQL中的
notexisting
子句。以下是我的实体:

我的问题是:


我确信我的条件是不正确的,但我找不到这种查询的正确方式。任何帮助都将不胜感激

要测试属性是否为null,请使用
isNull
。。。改变

Criteria criteria = session.createCriteria(Parent.class)
        .add(Restrictions.eq("children", null));
为了


否则,Hibernate将期望一个非空值来执行
eq

这是选择没有子级的父级的一个简单条件(对于一对多关系,您应该使用
isEmpty

顺便说一下,对于一个简单的“选择”查询,您不需要创建
事务
。上面的三行就足够了

另一个答案可能有效,但只适用于一对一的关系。
希望它能起作用

非常感谢@cristian meneses!它起作用了!在我的例子中,我实际上必须使用
isEmpty
来获得正确的结果。
public List<Parent> getParentsNotHavingChildren() {
    Session session = this.sessionFactory.getCurrentSession();
    Transaction txn = session.beginTransaction();
    List<Parent> result = null;
    Criteria criteria = session.createCriteria(Parent.class)
            .add(Restrictions.eq("children", null));
    result = criteria.list();
    txn.commit();
    if (session.isOpen()) {
        session.close();
    }
    log.info(String.format("Get %s parents", result.size()));
    return result;
}
org.hibernate.exception.GenericJDBCException: could not execute query
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.loader.Loader.doList(Loader.java:2545)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
    at org.hibernate.loader.Loader.list(Loader.java:2271)
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1716)
    at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
    at HibernateParentDao.getParentsNotHavingChildren(HibernateParentDao.java:42)
Caused by: java.sql.SQLException: Missing IN or OUT parameter at index:: 1
    at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
    at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:110)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:171)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:227)
    at oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:1737)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3376)
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3425)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1202)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1953)
    at org.hibernate.loader.Loader.doQuery(Loader.java:802)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
    at org.hibernate.loader.Loader.doList(Loader.java:2542)
Criteria criteria = session.createCriteria(Parent.class)
        .add(Restrictions.eq("children", null));
Criteria criteria = session.createCriteria(Parent.class)
        .add(Restrictions.isNull("children"));
Criteria criteria = currentSession().createCriteria(Parent.class);
criteria.add(Restrictions.isEmpty("children"));
return criteria.list();