Почему запрос не возвращает никакого результата, если таблица заполнена данными?

1

Следующий метод пытается получить данные для строки с java.sql.Time < currentTime. Несмотря на то, что таблица имеет ввод time less than current time, запрос не возвращает никакого результата, и программа никогда не входит во внутренний цикл while.

Почему это? Где я иду не так?

private void find() {
    Session session = new HVR().getSession();
    while(isThreadRunning) {

        String hql = "from Scheduled where stime <'" + new java.sql.Time(new GregorianCalendar().getTimeInMillis()) + "'";

        List list = session.createQuery(hql).list();
        Iterator iterator = list.iterator();
        System.out.println("Inside outer while loop");

        while(iterator.hasNext()) {
            System.out.println("Inside inner while loop");
            Scheduled scheduled = (Scheduled)iterator.next();
            String tweet = scheduled.getTweet();
            int id = scheduled.getId();
            tweetThread(tweet, id); // Tweet on a separate thread
        }
    }
}
  • 0
    попробуй createSQLQuery это работает. В HQL ваша временная метка не известна
  • 0
    @Sireesh Зачем вам нужна метка времени? Столбец таблицы имеет тип данных Time
Показать ещё 6 комментариев
Теги:
hibernate

3 ответа

0

Я никогда не пробовал, но вы должны иметь возможность выразить это в HQL, естественно, используя выражение HQL current_time():

String hql = "from Scheduled where stime < current_time()";
List list = session.createQuery(hql).list();

Если вы хотите изменить объект времени (арифметика даты сложна выше приведенной выше):

String hql = "from Scheduled where stime < :prevHour";
List list = session.createQuery(hql)
        .setTime("prevHour", new Date(new Date().getTime() - 3600 * 1000))
        .list();
0

Метод toString() в java.sql.Time даст вам только время дня (что-то вроде "12:05:59") без лет, месяцев и дней. Попробуйте использовать SimpleDateFormat:

//...

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String hql = "from Scheduled where stime <'" +
    dateFormat.format(new java.sql.Time(
        new GregorianCalendar().getTimeInMillis())) + "'";

//...
  • 0
    Я никогда не использовал java.sql.Date но Time
  • 0
    Извините, я немного сплю (4:05 утра) ответ отредактирован
Показать ещё 3 комментария
-2

Ваш hql должен использовать привязку параметров, поэтому вместо

String hql = "from Scheduled where stime <'" + new java.sql.Time(new GregorianCalendar().getTimeInMillis()) + "'";

Используйте что-то в соответствии с:

String hql = "from Scheduled where stime < :nowDate";
List list = session.createQuery(hql)
               .setDate("nowDate",new Date())
               .list();

Если вы смотрите строго по времени, вы бы привязывали.setTimestamp().

  • 0
    Как это поможет в этом случае?
  • 0
    @saplingPro hibernate должен иметь возможность генерировать правильный запрос при использовании привязки параметров. Иногда это лучший вариант, чем генерировать свой собственный hql. По моему опыту, пользовательские запросы, такие как вопрос (особенно с датой / временем), более подвержены ошибкам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню