【问题标题】:Does Hibernate allow getdate()?Hibernate 是否允许 getdate()?
【发布时间】:2020-06-01 23:17:49
【问题描述】:

目前我正在努力获取当天的值 (verifyCount),因此,在我对 SQL Server 的查询中,如下所示

select verifyCount from VerifyUser where idNo = 'ABC1234'
and cast(createdDatetime as Date) = cast(getdate() as Date)

在我的 Hibernate 函数中,我使用以下查询

public Integer doInHibernate(Session session) throws HibernateException, SQLException {
  String query = "SELECT vu .verifyCount FROM VerifyUser vu "
                + "WHERE vu .idNo= '"+ idNo+ "'"
                + "AND cast(pl.createdDatetime as Date) = cast(getdate() as Date)";

  Query q = session.createQuery(query);
  return (Integer) q.uniqueResult();
}

但我遇到如下错误

2020-06-02 07:02:28.018 [WebContainer : 0] ERROR k.c.m.b.w.AbstractGeneralErrorRequestListener 
  [n/a] - null
  java.lang.NullPointerException: null
  at org.hibernate.dialect.function.CastFunction.render(CastFunction.java:56)
  at org.hibernate.hql.ast.SqlGenerator.endFunctionTemplate(SqlGenerator.java:214)
  at org.hibernate.hql.antlr.SqlGeneratorBase.methodCall(SqlGeneratorBase.java:2325)
  at org.hibernate.hql.antlr.SqlGeneratorBase.simpleExpr(SqlGeneratorBase.java:2699)
  at org.hibernate.hql.antlr.SqlGeneratorBase.expr(SqlGeneratorBase.java:1465)
  at org.hibernate.hql.antlr.SqlGeneratorBase.binaryComparisonExpression(SqlGeneratorBase.java:2940)
  at org.hibernate.hql.antlr.SqlGeneratorBase.comparisonExpr(SqlGeneratorBase.java:1280)
  at org.hibernate.hql.antlr.SqlGeneratorBase.booleanExpr(SqlGeneratorBase.java:910)
  at org.hibernate.hql.antlr.SqlGeneratorBase.booleanOp(SqlGeneratorBase.java:2858)
  at org.hibernate.hql.antlr.SqlGeneratorBase.booleanExpr(SqlGeneratorBase.java:890)
  at org.hibernate.hql.antlr.SqlGeneratorBase.whereExpr(SqlGeneratorBase.java:768)
  at org.hibernate.hql.antlr.SqlGeneratorBase.selectStatement(SqlGeneratorBase.java:191)
  at org.hibernate.hql.antlr.SqlGeneratorBase.statement(SqlGeneratorBase.java:119)
  at org.hibernate.hql.ast.QueryTranslatorImpl.generate(QueryTranslatorImpl.java:240)
  at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:207)
  at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:138)
  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:124)
  at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
  at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
  at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1770)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:95)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
  at java.lang.reflect.Method.invoke(Method.java:508)
  at org.springframework.orm.hibernate3.HibernateTemplate$CloseSuppressingInvocationHandler.invoke(HibernateTemplate.java:1387)
at com.sun.proxy.$Proxy2575.createQuery(Unknown Source)

我怀疑 CASTgetdate() 函数不能用于 HQL 查询。

如果有任何想法或解决方案,真的很感激。

【问题讨论】:

    标签: java sql-server hql


    【解决方案1】:

    HQL 使用current_date() 获取当前日期。 您可以尝试将getdate() 替换为current_date() 并检查它是否解决了空指针问题。

    【讨论】:

    • 我尝试用 current_date() 替换。仍然抛出空指针。
    • 尝试使用转换而不是强制转换,如果您使用的是 sql server 2005,日期不是受支持的数据类型。将需要使用日期时间。在比较日期时,我们需要确保只检查日期部分而不是时间,因此最好转换为 varchar 然后进行比较。 select verifyCount from VerifyUser where idNo = 'ABC1234' and CONVERT(VARCHAR(10),createdDatetime,111) = CONVERT(VARCHAR(10),getdate(),111)
    • 问题已解决。我将createQuery 替换为createSQLQeury。谢谢你!
    猜你喜欢
    • 2015-01-31
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多