Mysql hibernate在数据存在的时间范围内不查询任何内容
你好: 我在使用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
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