当前位置: 首页 > 知识库问答 >
问题:

在Hibernate中不是有效的月份

爱亮
2023-03-14

嗨,我正在尝试根据开始和结束日期使用Hibernate从表中获取行数,但我得到的不是有效的月份错误

Session session = sessionFactory.getCurrentSession();         
startDate = "13-02-02 00:00:00";
endDate = "17-02-02 00:00:00";
try{
    String hql = "select Count(*) from mytable where PERIOD_START_DATETIME between '" 
                 + startDate + "' AND '" + endDate + "'";
    Query query = session.createQuery(hql);
    long count=(long) query.uniqueResult();

    return count;
} finally{
     session.close();
}

这是我的表格说明

Name                    NULL     TYPE
NAME                    NOT NULL VARCHAR2(255 CHAR)  
PERIOD_END_DATETIME     NOT NULL TIMESTAMP(6)        
PERIOD_START_DATETIME   NOT NULL TIMESTAMP(6)        
PROD_OFFER_TERM_TYPE_ID NOT NULL NUMBER(19)

共有3个答案

狄宜然
2023-03-14

确保在查询中实际传递日期值。可以使用to_date函数指定日期的格式,因为它在字符串中表示。

select Count(*) 
from mytable 
where PERIOD_START_DATETIME between to_date(startDate,'DD-MM-YYYY HH24:MI:SS') AND to_date(endDate,'DD-MM-YYYY HH24:MI:SS');
汝飞
2023-03-14

由于开始/结束时间在DB中SQLTIMESTAMPs,您可以将一个Timestamp对象传入查询,如下所示:

Session session = sessionFactory.getCurrentSession();

final DateFormat df = new SimpleDateFormat("yy-MM-dd");

// omitting the time part will set the time to midnight (00:00:00)
Timestamp start = new Timestamp(df.parse("13-02-02").getTime());
Timestamp end = new Timestamp(df.parse("17-02-02").getTime());

try {
    String hql = 
        "select Count(*) from mytable where PERIOD_START_DATETIME between ? AND ?";
    Query query = session.createQuery(hql)
            .setTimestamp(0, start)
            .setTimestamp(1, end);

    long count = (long) query.uniqueResult();

    return count;
} finally {
    session.close();
}
包沈义
2023-03-14

使用字符串串联生成SQL查询通常是一个坏主意,因为

  • 这对性能不利(每次执行都会导致重新解析SQL语句)
  • 容易SQL注射发作

HQL支持绑定变量/预准备语句,因此这应该可以工作:

String hql = "select Count(*) from mytable where PERIOD_START_DATETIME between :startdate AND :enddate ";
Query query = session.createQuery(hql);
query.setParameter("startdate", startDate);
query.setParameter("enddate", endDate);

(其中startDate和endDate是实际的java.sql.Timestamp值,而不是字符串)。

 类似资料:
  • 我有一个包含以下字段的表: 报告(表名)Rep_Date(日期)Rep_Time(日期) 更新15:58我现在可以执行以下查询: 但是,我需要在子句中再添加一条语句,将MaxDate的时间部分与rep_time:不起作用。

  • 这是我的oracle sql查询。我正在用Python运行它。当我在Oracle SQL Developer中运行它时,它会给出结果,但每当我试图在pycharm中执行它时,就会出现以下错误: cx_oracle.databaseError:ORA-01843:不是有效月份 当我跑的时候 这在oracle sql developer中显示

  • 我为PHP更改了OCI8版本,由于该查询不起作用: 我收到这个消息: 消息:oci_execute():ora-01843:不是有效月份 它与Toad一起用于Oracle11。你有什么解决办法吗? 谢谢:)

  • 我正在websphere 7.0版本上运行一个应用程序,该应用程序是在我的QA环境中新设置的,并且低于oracle错误

  • 我有一个在PL-SQL视图中使用的查询。该视图包含一个名为Jde_date的函数,该函数采用Julian格式的date参数并将其转换为Gregorian格式,它工作得很好。 查询如下: 但是当我发布报告时,我得到错误ORA-01843:不是一个有效的月份。 我该怎么解决?