hibernate неожиданный конец поддерева при работе с коллекцией основ - PullRequest
5 голосов
/ 04 января 2011

у меня есть следующая сущность: <pre> @Entity public class AnalysisPolicy extends PersistentEntity{ private Set nodeIds;</p> <pre><code>@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; }

}

и я пытаюсь выполнить следующий запрос JPQL: select p from AnalysisPolicy p where p.nodeIds is not empty

результат примерно такой: 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'</p> <p>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

с последующей длинной трассировкой стека. я обнаружил похожую проблему переполнения стека здесь , где проблема заключалась в том, что синтаксис для коллекций базовых сущностей отличается, так что в настоящее время я думаю, что моя «не пустая» часть должна быть заменена чем-то другим , Кроме того, я не мог заставить работать "is not null". «size (nodeIds)> 1» работает, но сгенерированный SQL имеет внутренний выбор, который был бы очень плох с точки зрения производительности.

каковы мои способы решения этой проблемы? (при условии, что я не хочу «обновлять» коллекцию до коллекции сущностей).

Ответы [ 2 ]

7 голосов
/ 04 января 2011

HQL документация описывает следующий синтаксис, он также работает в JPQL Hibernate:

select p from AnalysisPolicy p where exists elements(p.nodeIds)

Смотри также:

0 голосов
/ 04 января 2011

Вы можете попробовать это:

select p from AnalysisPolicy as p join p.nodeIds group by p
...