200分问一个简单hibernate的isnull问题

peihexian 2005-05-10 01:59:53
我用的sql server 2000,这样的HSQL为什么hibernate总是报错?

String HSQL="select isnull(count(a),0) from CustomerUnitInfo a where a.unitId="+UnitId;
result=((Integer)DbSession.iterate(HSQL).next()).intValue();

抱错如下:


net.sf.hibernate.QueryException: undefined alias: isnull [select isnull(count(a),0) from com.bkgd.water.dao.tables.CustomerUnitInfo a where a.unitId=5]

at net.sf.hibernate.hql.PathExpressionParser.token(PathExpressionParser.java:103)

at net.sf.hibernate.hql.ParserHelper.parse(ParserHelper.java:29)

at net.sf.hibernate.hql.SelectParser.token(SelectParser.java:170)

at net.sf.hibernate.hql.ClauseParser.token(ClauseParser.java:87)

at net.sf.hibernate.hql.ClauseParser.end(ClauseParser.java:114)

at net.sf.hibernate.hql.PreprocessingParser.end(PreprocessingParser.java:143)

at net.sf.hibernate.hql.ParserHelper.parse(ParserHelper.java:30)

at net.sf.hibernate.hql.QueryTranslator.compile(QueryTranslator.java:149)

at net.sf.hibernate.hql.QueryTranslator.compile(QueryTranslator.java:138)

at net.sf.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:295)

at net.sf.hibernate.impl.SessionImpl.getQueries(SessionImpl.java:1572)

at net.sf.hibernate.impl.SessionImpl.iterate(SessionImpl.java:1602)

at net.sf.hibernate.impl.SessionImpl.iterate(SessionImpl.java:1592)

at net.sf.hibernate.impl.SessionImpl.iterate(SessionImpl.java:1584)


看错误提示大概是hibernate认为isnull是一个别名,可这个是sql server的关键字啊?
hibernate的配置文件中我已经设置为:

<property name="dialect">net.sf.hibernate.dialect.SQLServerDialect</property>

我用的jtds的sql server jdbc 驱动,用ms的那三个文件的jdbc驱动也是一样报错,hibernate版本2.1.8。

...全文
540 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
peihexian 2005-05-11
  • 打赏
  • 举报
回复
我自己解决了,结帐。
lippea 2005-05-10
  • 打赏
  • 举报
回复
up sgdb(神天月晓)
照说明看来,可能是在select中不支持,但在where条件中支持。
jihanzhong 2005-05-10
  • 打赏
  • 举报
回复
count(a) 不可能出现null的8!
peihexian 2005-05-10
  • 打赏
  • 举报
回复
可是hibernate的文档中明明就用了isnull函数啊?

The next query uses the MS SQL Server isNull() function to return all the accounts and unpaid payments for the organization to which the current user belongs. It translates to an SQL query with three inner joins, an outer join and a subselect against the ACCOUNT, PAYMENT, PAYMENT_STATUS, ACCOUNT_TYPE, ORGANIZATION and ORG_USER tables.

select account, payment
from Account as account
left outer join account.payments as payment
where :currentUser in elements(account.holder.users)
and PaymentStatus.UNPAID = isNull(payment.currentStatus.name, PaymentStatus.UNPAID)
order by account.type.sortOrder, account.accountNumber, payment.dueDate
sgdb 2005-05-10
  • 打赏
  • 举报
回复
说明hql不支持isnul,你可以使用原始的sql语句来做

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧