【问题标题】:Why does this return null?为什么这会返回 null?
【发布时间】:2013-03-24 20:43:53
【问题描述】:

我成功发送了日期值。我检查了“作用域变量”。

这是我的 bean 中的一个函数,它调用了 helper 中的一个函数:

public DataModel getFt() {
    ftDataModel = new ListDataModel((List) fthelper.getByBeginDate(beginDate));
    return ftDataModel;
}

这是将beginDate 发送到Hibernate 的函数。但是在这里它返回null。为什么?

public FinancialTransactions getByBeginDate(String beginDate){            
    List<FinancialTransactions> FtList = null;        
    try {
        org.hibernate.Transaction tx = session.beginTransaction();
        Query q = session.createQuery("from FinancialTransactions where DATE='" + beginDate + "'");
        FtList = (List<FinancialTransactions>) q.list();

    } catch (Exception e) {
        e.printStackTrace();
    }
    return FtList.get(0);
}

【问题讨论】:

  • 因为查询没有找到任何东西?
  • 可能查询没有返回数据,尝试单独运行查询,查看返回多少行
  • 是否打印了异常堆栈跟踪?
  • 旁注:你真的应该清理你的输入。这是开放的注射。 See here.
  • @Brian 是的,这个where DATE='" + beginDate + "'" 很好吃:-D

标签: java hibernate


【解决方案1】:

其中一个:

org.hibernate.Transaction tx = session.beginTransaction();
Query q = session.createQuery("from FinancialTransactions where DATE='" + beginDate + "'");

抛出异常。使用调试器或简单的 System.out... 找出这两者中的哪一个。

【讨论】:

  • 如果是这样的话,就会打印异常堆栈跟踪。
【解决方案2】:

您应该在查询中使用参数:

Query q = session.createQuery("from FinancialTransactions where DATE=:date").setParameter("date",beginDate);

应该没有内部异常,否则 FtList.get(0) 也会导致异常。

我的猜测是格式化。您使用日期的字符串表示。总是一个坏主意,因为在转换中可能会出错。

【讨论】:

  • 我用“。”作为分隔符。那是错的吗?我也不知道“FtList.get(0)”是什么意思?有错吗?
  • return FtList.get(0);如果查询因错误而失败,则将引发异常,因为列表 (FtList) 将为空。使用 ”。” as separator 没问题,但您的数据库可能使用其他格式。
  • db 中的 DATE 字段是 VARCHAR,所以我认为没问题。
  • FtList.get(0);这是什么意思?
  • return FtList.get(0) 是方法 getByBeginDate 的最后一条语句。您应该打开休眠查询日志并检查为查询生成的语句是否符合预期并返回正确的结果。 beginDate 可能有小时/分钟/秒,而 db 字段没有。
猜你喜欢
  • 2013-08-09
  • 1970-01-01
  • 2013-06-05
  • 2014-05-23
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
相关资源
最近更新 更多