Спящий запрос ничего не в период времени, когда существуют данные - PullRequest
1 голос
/ 22 февраля 2011

Привет: я сталкиваюсь с очень странной проблемой, когда использую 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

Кажется, дата начала и окончания правильные

Ответы [ 2 ]

1 голос
/ 22 февраля 2011

Обратите внимание, что вы передаете параметры через setDate(), поэтому они интерпретируются как тип SQL DATE.В случае нативного запроса вы передаете даты как литералы даты, и я предполагаю, что в этом случае они интерпретируются как TIMESTAMP s.Это единственная разница между HQL и нативными запросами.

Поэтому попробуйте передать параметры через setTimestamp().

1 голос
/ 22 февраля 2011

Каков результат, когда вы делаете System.out.println(end) и System.out.println(start)?Они в правильном формате?

Mysql может генерировать очень странные результаты, если формат времени немного отличается от ожидаемого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...