2010-02-26 181 views
0

我想查询休眠对于给定的情景:HQL查询与where子句

我的数据模型

类通讯:

变量:主体,sentTo,创造者。

现在让我们说在usera和userb之间交换了一些笔记。我想通过hibernate查询找到所有这些笔记。我写下了我的查询字符串。

select note from Communication n where n.subject=:subject and ((n.sentTo=:sentto and n.creator=:creator) or (n.sentTo:creator and n.creator=:sentto)) 

但hibernate无法解析此查询。请建议做什么?

异常的分析器抛出

2010-02-26 15:34:37,169 DEBUG [ErrorCounter] line 1:114: unexpected token: : 
line 1:114: unexpected token: : 
at org.hibernate.hql.antlr.HqlBaseParser.atom(HqlBaseParser.java:3520) 
at org.hibernate.hql.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3216) 
at org.hibernate.hql.antlr.HqlBaseParser.multiplyExpression(HqlBaseParser.java:3098) 
at org.hibernate.hql.antlr.HqlBaseParser.additiveExpression(HqlBaseParser.java:2818) 
at org.hibernate.hql.antlr.HqlBaseParser.concatenation(HqlBaseParser.java:570) 
at org.hibernate.hql.antlr.HqlBaseParser.relationalExpression(HqlBaseParser.java:2586) 
at org.hibernate.hql.antlr.HqlBaseParser.equalityExpression(HqlBaseParser.java:2449) 
at org.hibernate.hql.antlr.HqlBaseParser.negatedExpression(HqlBaseParser.java:2413) 
at org.hibernate.hql.antlr.HqlBaseParser.logicalAndExpression(HqlBaseParser.java:2331) 
at org.hibernate.hql.antlr.HqlBaseParser.logicalOrExpression(HqlBaseParser.java:2296) 
at org.hibernate.hql.antlr.HqlBaseParser.expression(HqlBaseParser.java:2082) 
at org.hibernate.hql.antlr.HqlBaseParser.expressionOrVector(HqlBaseParser.java:4181) 
at org.hibernate.hql.antlr.HqlBaseParser.primaryExpression(HqlBaseParser.java:944) 
at org.hibernate.hql.antlr.HqlBaseParser.atom(HqlBaseParser.java:3438) 
at org.hibernate.hql.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3216) 
at org.hibernate.hql.antlr.HqlBaseParser.multiplyExpression(HqlBaseParser.java:3098) 
at org.hibernate.hql.antlr.HqlBaseParser.additiveExpression(HqlBaseParser.java:2818) 
at org.hibernate.hql.antlr.HqlBaseParser.concatenation(HqlBaseParser.java:570) 
at org.hibernate.hql.antlr.HqlBaseParser.relationalExpression(HqlBaseParser.java:2586) 
at org.hibernate.hql.antlr.HqlBaseParser.equalityExpression(HqlBaseParser.java:2449) 
at org.hibernate.hql.antlr.HqlBaseParser.negatedExpression(HqlBaseParser.java:2413) 
at org.hibernate.hql.antlr.HqlBaseParser.logicalAndExpression(HqlBaseParser.java:2331) 
at org.hibernate.hql.antlr.HqlBaseParser.logicalOrExpression(HqlBaseParser.java:2306) 
at org.hibernate.hql.antlr.HqlBaseParser.expression(HqlBaseParser.java:2082) 
at org.hibernate.hql.antlr.HqlBaseParser.expressionOrVector(HqlBaseParser.java:4181) 
at org.hibernate.hql.antlr.HqlBaseParser.primaryExpression(HqlBaseParser.java:944) 
at org.hibernate.hql.antlr.HqlBaseParser.atom(HqlBaseParser.java:3438) 
at org.hibernate.hql.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3216) 
at org.hibernate.hql.antlr.HqlBaseParser.multiplyExpression(HqlBaseParser.java:3098) 
at org.hibernate.hql.antlr.HqlBaseParser.additiveExpression(HqlBaseParser.java:2818) 
at org.hibernate.hql.antlr.HqlBaseParser.concatenation(HqlBaseParser.java:570) 
at org.hibernate.hql.antlr.HqlBaseParser.relationalExpression(HqlBaseParser.java:2586) 
at org.hibernate.hql.antlr.HqlBaseParser.equalityExpression(HqlBaseParser.java:2449) 
at org.hibernate.hql.antlr.HqlBaseParser.negatedExpression(HqlBaseParser.java:2413) 
at org.hibernate.hql.antlr.HqlBaseParser.logicalAndExpression(HqlBaseParser.java:2341) 
at org.hibernate.hql.antlr.HqlBaseParser.logicalOrExpression(HqlBaseParser.java:2296) 
at org.hibernate.hql.antlr.HqlBaseParser.expression(HqlBaseParser.java:2082) 
at org.hibernate.hql.antlr.HqlBaseParser.logicalExpression(HqlBaseParser.java:1858) 
at org.hibernate.hql.antlr.HqlBaseParser.whereClause(HqlBaseParser.java:454) 
at org.hibernate.hql.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:708) 
at org.hibernate.hql.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:296) 
at org.hibernate.hql.antlr.HqlBaseParser.statement(HqlBaseParser.java:159) 
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:271) 
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180) 
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:134) 
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101) 
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80) 
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94) 
at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:436) 
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:384) 
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1327) 
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867) 
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:871) 
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:797) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1460) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1398) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:512) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189) 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322) 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1305) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1067) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:557) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:842) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:416) 
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261) 
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:192) 
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) 
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972) 
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4467) 
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
at org.apache.catalina.core.StandardHost.start(StandardHost.java:722) 
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) 
at org.apache.catalina.core.StandardService.start(StandardService.java:516) 
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) 
at org.apache.catalina.startup.Catalina.start(Catalina.java:593) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) 
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) 
+0

你的AND查询后需要另外一组括号来包装你的OR语句。 – 2010-02-26 08:52:18

+0

它如何解析它?异常,null,意外的行为? – Bozho 2010-02-26 09:09:24

+0

我已经添加了堆栈跟踪,并且由Mahesh给出的查询 – 2010-02-26 09:53:41

回答

2

尝试使用:

select note from Communication n where n.subject=:subject and ((n.sentTo=:sentto and n.creator=:creator) or (n.sentTo:creator and n.creator=:sentto)) 

别名Communication失踪,你想通过它的别名'n'访问它(这是没有定义)

感谢

0

我不知道是否有错误,但你的别名n不似乎是在查询中定义。

你能给我们堆栈跟踪吗?

1

休眠正在下降在这里:

(n.sentTo:creator and n.creator=:sentto) 
---------^ 

我怀疑这应该是

(n.sentTo = :creator and n.creator=:sentto) 
---------^^^ 
+0

是benny;这也是问题。这个查询是这样工作的 select n from Communication n where n.subject =:subject and((n.sentTo =:sentto and n.creator =:creator)or(n.sentTo =:creator and n.creator =发送)) 谢谢 – 2010-02-26 10:24:18