hibernate fin inattendue de la sous-arborescence lorsque vous traitez avec de la collection de bases
j'ai l'entité suivante:
@Entity
public class AnalysisPolicy extends PersistentEntity{
private Set nodeIds;
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(
name="analysis_policy_nodes",
joinColumns=@JoinColumn(name="analysis_policy_id")
)
@Column(name="node_id")
public Set<Long> getNodeIds() {
return nodeIds;
}
}
et im essayant la suite de la requête JPQL:
select p from AnalysisPolicy p where p.nodeIds is not empty
le résultat est quelque chose comme:
10:11:16,665 DEBUG [org.hibernate.hql.ast.AST] --- SQL AST ---
-[SELECT] QueryNode: 'SELECT' querySpaces (AnalysisPolicy,analysis_policy_nodes)
+-[SELECT_CLAUSE] SelectClause: '{select clause}'
| -[ALIAS_REF] IdentNode: 'analysispo0_.f_id as f1_8_' {alias=p, className=com.emc.dpa.datamodel.analysis.AnalysisPolicy, tableAlias=analysispo0_}
+-[FROM] FromClause: 'from' FromClause{level=1, fromElementCounter=1, fromElements=1, fromElementByClassAlias=[p], fromElementByTableAlias=[analysispo0_], fromElementsByPath=[], collectionJoinFromElementsByPath=[], impliedElements=[]}
| -[FROM_FRAGMENT] FromElement: 'AnalysisPolicy analysispo0_' FromElement{explicit,collection join,not a fetch join,fetch non-lazy properties,classAlias=p,role=null,tableName=AnalysisPolicy,tableAlias=analysispo0_,origin=null,columns={,className=com.emc.dpa.datamodel.analysis.AnalysisPolicy}}
-[WHERE] SqlNode: 'where'
-[EXISTS] UnaryLogicOperatorNode: 'exists'
-[SELECT] QueryNode: 'SELECT' querySpaces (AnalysisPolicy,analysis_policy_nodes)
+-[SELECT_CLAUSE] SelectClause: '{derived select clause}'
+-[FROM] FromClause: 'from' FromClause{level=2, fromElementCounter=0, fromElements=1, fromElementByClassAlias=[], fromElementByTableAlias=[nodeids1_], fromElementsByPath=[], collectionJoinFromElementsByPath=[p.nodeIds], impliedElements=[]}
| -[FROM_FRAGMENT] ImpliedFromElement: 'analysis_policy_nodes nodeids1_' ImpliedFromElement{implied,collection join,not a fetch join,fetch non-lazy properties,classAlias=null,role=com.emc.dpa.datamodel.analysis.AnalysisPolicy.nodeIds,tableName={none},tableAlias=nodeids1_,origin=AnalysisPolicy analysispo0_,columns={,className=null}}
-[WHERE] SqlNode: 'WHERE'
-[THETA_JOINS] SqlNode: '{theta joins}'
-[SQL_TOKEN] SqlFragment: 'analysispo0_.f_id=nodeids1_.analysis_policy_id'
10:11:16,681 DEBUG [org.hibernate.hql.ast.ErrorCounter] throwQueryException() : no errors 10:11:16,712 ERROR [org.hibernate.hql.PARSER] :0:0: unexpected end of subtree
suivie par une longue trace de la pile. j'ai trouvé un similaire stackoverflow question ici où le problème est que la syntaxe est différente pour les collections d'entités de base, donc ce que je pense aujourd'hui, c'est que mon "n'est pas vide" doit être remplace par autre chose.
aussi, je ne pouvais pas obtenir "n'est pas nulle" pour le travail". taille(nodeIds)>1" fonctionne, mais le SQL généré a une sélection interne qui serait vraiment mauvais en termes de performances.
quelles sont mes façons de contourner cela? (en supposant que je ne veux pas de "mise à niveau" de la collection une collection d'entités).
OriginalL'auteur radai | 2011-01-04
Vous devez vous connecter pour publier un commentaire.
HQL documentation décrit la syntaxe suivante, il travaille également dans Hibernate JPQL:
Voir aussi:
Il ressemble à
elements
est défini pour l'ensemble de la collection de valeur des propriétés, y compris à de nombreuses relations.OriginalL'auteur axtavt
Vous pouvez essayer ceci:
OriginalL'auteur jpkrohling