Привет: я сталкиваюсь с очень странной проблемой, когда использую 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());
Из вышесказанного кажется, что вдБ есть
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 "!!!
Кроме того, я также провел тест в БД,
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();
}
}
OutPut:
get 0 results by hibernate
++++++++++++++
get 24 results by sql query
Также из журнала гиберната я получаю:
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
Кажется, дата начала и окончания правильные