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
Vous devez vous connecter pour publier un commentaire.
Donner un coup de cette:
L'utilisation des éléments suivants sont des noms de propriété, et non pas les noms de colonne:
Comme une note de côté, si ce n'est pas un générées dynamiquement la requête, avez-vous réfléchi à l'aide de requêtes HQL à la place?
OriginalL'auteur javagruffian