Hibernate Critères De L'Api Sous-Requêtes

Je suis actuellement en train de travailler sur un projet de transfert de certains anciens jdbc sélectionnez instructions sur l'utilisation d'Hibernate et les critères de l'api.

Les deux colonnes de la table et de la requête SQL ressemble:

-QUERIES-
primaryId

-QUERYDETAILS-
primaryId
linkedQueryId -> Foreign key references queries.primaryId
value1
value2

select * 
from queries q 
where q.primaryId not in (SELECT qd.linkedQueryId 
                          FROM querydetails qd 
                          WHERE (qd.value1 LIKE 'PROMPT%' 
                                 OR qd.value2 LIKE 'PROMPT%'));

Mon entité relations ressembler à:

@Table("queries")
public class QueryEntity{

    @Id
    @Column
    private Long primaryId;
    @OneToMany(targetEntity = QueryDetailEntity.class, mappedBy = "query", fetch = FetchType.EAGER)
    private Set<QueryDetailEntities> queryDetails;

    //..getters/setters..

}

@Entity
@Table(name = "queryDetails")
public class QueryDetailEntity {
    @Id
    @Column
    private Long primaryId;

    @ManyToOne(targetEntity = QueryEntity.class)
    private QueryEntity query;

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

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

    //..getters/setters..

}

Je suis d'essayer d'utiliser l'api des critères de cette façon:

Criteria crit = sessionFactory.getCurrentSession().createCriteria(QueryEntity.class);

DetachedCriteria subQuery = DetachedCriteria.forClass(QueryDetailEntity.class);
LogicalExpression hasPrompt = Restrictions.or(Restrictions.ilike("value1", "PROMPT%"),
        Restrictions.ilike("value2", "PROMPT%"));
subQuery.add(hasPrompt);
Criterion subQueryCrit = Subqueries.notIn("queryDetails", subQuery);
crit.add(subQueryCrit);

List<QueryMainEntity> entities = (List<QueryMainEntity>) crit.list();
System.out.println("# of results = " + entities.size());

Je suis un NullPointerException sur le crit.list() de la ligne qui ressemble à

Exception in thread "main" java.lang.NullPointerException
    at org.hibernate.loader.criteria.CriteriaQueryTranslator.getProjectedTypes(CriteriaQueryTranslator.java:362)
    at org.hibernate.criterion.SubqueryExpression.createAndSetInnerQuery(SubqueryExpression.java:153)
    at org.hibernate.criterion.SubqueryExpression.toSqlString(SubqueryExpression.java:69)
    at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:380)
    at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:114)
    at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:83)
    at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:92)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1687)
    at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)

Maintenant, je pense que c'est assez sûr de dire que je suis en utilisant les Critères de l'Api/Détaché de la Requête Api tort, mais je ne suis pas sûr de ce que la "bonne" façon de faire c'est depuis le Hibernate Docs seulement de passer en revue les critères de l'api sous-requêtes.

Je réalise que c'est une bonne question, mais je suppose que sa semble mettre tous les aspects pertinents de la question (requête que j'essaie de représenter via les API des Critères, des tables, des entités).

OriginalL'auteur BuffaloBuffalo | 2011-05-05