Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql hibernate在数据存在的时间范围内不查询任何内容_Mysql_Hibernate - Fatal编程技术网

Mysql hibernate在数据存在的时间范围内不查询任何内容

Mysql hibernate在数据存在的时间范围内不查询任何内容,mysql,hibernate,Mysql,Hibernate,你好: 我在使用hibernate进行查询时遇到了一个非常奇怪的问题: 这是核心代码: SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); start = sdf.parse("2011-02-22 10:00:00"); end = sdf.parse("2011-02-22 16:00:00"); Query q = sess.createQuery("select log

你好: 我在使用hibernate进行查询时遇到了一个非常奇怪的问题:

这是核心代码:

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    start = sdf.parse("2011-02-22 10:00:00");
    end = sdf.parse("2011-02-22 16:00:00");


    Query q = sess.createQuery("select log.uri,count(log.uri) as num from LogEntry log where log.time between ? and ? group by log.uri order by num desc")
            .setDate(0, start).setDate(1, end);
    System.out.println(q.list()); //here I got 0 result,

    System.out.println("===== Make the start date smaller =========");
    start=sdf.parse("2011-02-21 10:00:00");
    q = sess.createQuery("select log.uri,count(log.uri) as num from LogEntry log where log.time between ? and ? group by log.uri order by num desc")
            .setDate(0, start).setDate(1, end);
    System.out.println(q.list()); //here I got 26 result

    System.out.println("===== Make the end date bigger =========");
    end=sdf.parse("2011-02-23 16:00:00");
    q = sess.createQuery("select log.uri,count(log.uri) as num from LogEntry log where log.time between ? and ? group by log.uri order by num desc")
            .setDate(0, start).setDate(1, end); //here I got 39 result
    System.out.println(q.list());
从上面看,db中似乎有

00结果介于“2011-02-22 10:00:00”和“2011-02-22 16:00:00”之间,但有

23结果介于“2011-02-21 10:00:00”和“2011-02-23 16:00:00”之间

所以这意味着在“2011-02-22 16:00:00”和“2011-02-23 16:00:00”之间一定会有一些结果,但当我做这个测试时,当前时间是“2011-02-22 14:45:00”

另外,我也在db中做了一个测试

select uri,count(uri) as num from xxx_log where time between 20110222100000 and 20110222160000 group by uri order by num desc
我在一组中有23行。

所以我想知道为什么它如此令人惊讶

我的密码有什么问题吗

顺便说一句,我使用mysql 5.1

更新:

这是另一个测试代码,首先使用hibernate,然后使用本机sql:

@Test
public void testSQLAndHibernate() throws ParseException {
    start = sdf.parse("2011-02-22 10:00:00");
    end = sdf.parse("2011-02-22 16:00:00");
    // use hibernate
    Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
    sess.beginTransaction();

    Query q = sess
            .createQuery(
                    "select log.uri,count(log.uri) as num from LogEntry log where log.time between ? and ? group by log.uri order by num desc")
            .setDate(0, start).setDate(1, end);
    System.out.println("get "+q.list().size()+" results by hibernate");

    System.out.println("++++++++++++++");
    // use sql
    SimpleDateFormat sdf_sql = new SimpleDateFormat("yyyyMMddHHmmss");
    String sql = "select uri,count(uri) as num from t_log where time between "
            + sdf_sql.format(start) + " and " + sdf_sql.format(end)
            + " group by uri order by num desc";
    try {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db",
                "root", "0000");
        Statement state = conn.createStatement();
        ResultSet rs = state.executeQuery(sql);
        int i=0;
        while (rs.next()) {
            //System.out.println(rs.getString(1) + " " + rs.getLong(2));
            i++;
        }
        System.out.println("get "+i+" results by sql query");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
输出:

我还从Hibernate日志中得到:

binding parameter [1] as [DATE] - Tue Feb 22 10:00:00 CST 2011
binding parameter [2] as [DATE] - Tue Feb 22 16:00:00 CST 2011

开始和结束日期似乎是正确的

当您执行
System.out.println(结束)
System.out.println(开始)
时,结果是什么?它们的格式正确吗


如果时间格式与预期不符,Mysql可能会生成非常奇怪的结果。

请注意,您通过
setDate()
传递参数,因此它们被解释为SQL类型
DATE
。在本机查询的情况下,您将日期作为日期文本传递,我猜在这种情况下,它们将被解释为
TIMESTAMP
s。这是HQL和本机查询之间的唯一区别


因此,请尝试通过
setTimestamp()

传递参数。我没有打印数据,但从hibernate的绑定日志中,日期是正确的,但我不确定格式是否正确。好的,我已经在hibernate和本机sql之间进行了完整测试,输出结果,请检查udpate:)我对hibernate不太了解,但是有没有办法格式化日期?您还可以尝试获取hibernate脚本正在运行的mysql查询。但是,如果我扩大了日期范围,为什么我可以得到一些结果呢?让开始日期变小或结束日期变大?谢谢,我明天会试试,我现在在家。:)
binding parameter [1] as [DATE] - Tue Feb 22 10:00:00 CST 2011
binding parameter [2] as [DATE] - Tue Feb 22 16:00:00 CST 2011