2016-05-25 12 views
1

私は次のエンティティ、親と子を持っています。親オブジェクトに子がない可能性があります。休止状態で子供を持たない親を選択するには?これは、SQLのnot existing節に似ています。ここに私のエンティティは以下のとおりです。 Hibernateで子なしの親オブジェクトを選択する方法は?

@Entity 
@Table(name = "PARENT") 
public class Parent implements Serializable { 

    @Id 
    @Column(name="PARENT_ID") 
    private Long parentId; 

    @Column(name="NAME") 
    private String name; 

    @OneToMany(mappedBy="parent", fetch=FetchType.EAGER) 
    Set<Child> children; 
} 
@Entity 
@Table(name = "CHILD") 
public class Child implements Serializable { 

    @Id 
    @Column(name="CHILD_ID") 
    private Long childId; 

    @Column(name="NAME") 
    private String name; 

    @ManyToOne(cascade={CascadeType.ALL}, fetch=FetchType.EAGER) 
    @JoinColumn(name="PARENT_ID", nullable=false, updatable=false) 
    private Parent parent; 
} 

マイクエリ:次に

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.isNull("children")); 

ため

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

を変更...その後isNullを使用し、nullにする属性をテストする

答えて

3

そうでない場合は、Hibernateはeq

を実行するにはnull以外の値を期待しています
+0

ありがとう@クリスチャンメネシェス!できます! 私の場合、実際には正しい結果を得るために 'isEmpty'を使う必要があります。 – Sapience

関連する問題