Передать значение и использовать его в пользовательском запросе Liferay

Мне нужно выбрать дату (выбор даты Liferay), введенную пользователем, и отобразить содержимое на основе этой даты в jsp. По умолчанию, когда страница загружается, дата будет текущей датой, и, следовательно, должны отображаться данные текущей даты.

Я использую пользовательский запрос и делаю вызов в jsp следующим образом:

 List<Object[]> ObjdisplayAttListName = AttendanceLocalServiceUtil.findAttendance(currdate);

currdate – это дата, данные которой должны отображаться.

В пользовательском запросе у меня есть:

 select stud.studName , stud.empTitle, attendance.attRemarks, attendance.attStatus , stud.fileEntryI from student stud left outer join attendance attendance on stud.studId = attendance.studId and attendance.attDate LIKE ? order by studName asc;

Я всегда получаю исключение нулевого указателя. Как я могу получить NPE? и правильный ли мой запрос, когда я пишу attendance.attDate LIKE ? В моем jsp у меня есть средство выбора даты, которое находится внутри формы. эта дата также используется для обработки данных путем передачи их в класс java. Как мне извлечь эту дату и отправить ее в пользовательский запрос?

Вот мой FinderImpl:

 public class AttendanceFinderImpl extends BasePersistenceImpl  implements AttendanceFinder {

  public static String FIND_Attendance = "findAttendance";

@SuppressWarnings("rawtypes")
public List findAttendance(Date attendanceDate) throws SystemException {

    List attSearchList = null;
    Session session = null;
    try {
    session = openSession();
    String sql = CustomSQLUtil.get(FIND_Attendance);
    System.out.println("session : " + session);
    System.out.println("SQL QUERY CustomSQLUtil.get(findAttendance): " + CustomSQLUtil.get("findAttendance"));
    SQLQuery query = session.createSQLQuery(sql);
    System.out.println("SQLQuery : " + query);
    //query.addEntity("Attendance", AttendanceImpl.class);
    //query.addEntity("Employee", EmployeeImpl.class);
    QueryPos qPos = QueryPos.getInstance(query);
    System.out.println("I am returning the query : " + query);
    System.out.println("List size.list: "+ query.list());
    qPos.add(attendanceDate);
    System.out.println("List size: "+ query.list().size());
    return (List)query.list();
    }catch (Exception e) {
    }
    return null;

    }

}


person Seeya K    schedule 25.05.2013    source источник
comment
Является ли столбец attendance.attDate типом даты или строкой? Также я думаю, что, поскольку вы не ловите никаких исключений, вместо этого вы получаете Null-pointer, поскольку вы делаете return null. В вашем методе поиска есть еще одно исключение, которое нужно выяснить e.printStackTrace().   -  person Prakash K    schedule 27.05.2013
comment
Я думаю, что ошибка может быть SQLGrammerException, поскольку вы не заменили вопросительный знак LIKE ?. О, я вижу, что в этом комментарии вы добавили qPos, но не обновили свой вопрос.   -  person Rasabihari Kumar    schedule 27.05.2013
comment
@ Расабихари Кумар: Мне нужно заменить LIKE? -знак вопроса с какой-то переменной? Прямо сейчас он отображает результаты, но не отображает правильные результаты этой даты. Когда я печатаю дату в finderImpl, она печатает правильную дату   -  person Seeya K    schedule 01.06.2013


Ответы (1)


Я предполагаю, что и «currdate», и «atttance.attDate» являются типами java.util.Date. Если это так, то я думаю, что ваша проблема начинается со сравнения дат с оператором sql LIKE, который на самом деле предназначен для использования со сравнением строк.

Если вы работаете с датами, вы должны работать с '>' и '‹', так как практически невозможно точно сопоставить 2 символа даты, особенно если один из них создается с помощью отправки в реальном времени (новый экземпляр создается с помощью new Date() ) и будет иметь точность на уровне миллисекунд, а даты, которые вы получаете из средства выбора даты, будут выглядеть как 02-12-2013 00:00:00

person yannicuLar    schedule 26.05.2013
comment
Я удалил LIKE в классе FinderImpl, который я изменил: qPos.add(attendanceDate); как qPos.add(% +ttenceDate+%); Так что теперь он не показывает NPE - person Seeya K; 27.05.2013
comment
можете ли вы отладить и дать мне значение var 'currdate' во время выполнения? Просто распечатайте его перед вызовом AttendanceLocalServiceUtil.findAttendance(currdate); - person yannicuLar; 27.05.2013
comment
Я напечатал дату в finderImpl, она печатает правильную дату ... но да, как вы сказали, печатает 02-12-2013 00:00:00. У меня нет двух дат для сравнения. Мне нужно только получить данные, если они совпадают с датой.. как запрос, который я показал в своих запросах. мне нужно заменить знак ?-ques в запросе? он извлекает результаты запроса, но не точные результаты на эту дату. как мне структурировать запрос, чтобы он извлекал данные на заданную дату. - person Seeya K; 01.06.2013
comment
эта дата, которую вы получаете из базы данных или выбранной даты выбора даты? - person Laxman Rana; 01.06.2013
comment
Я думаю, вы все еще сравниваете даты с операндом «Нравится», и это неправильно. Даже если функция не рухнет, скорее всего, она не вернет никаких результатов. Даже если бы сопоставление Date-›toString работало, дата вроде «12-02-2013 12:05:26» не вернет true по сравнению с «12-12-2013 00:00:00». Было бы так, если бы его сравнивали с «% 02-12-2013%». Я настоятельно рекомендую вам протестировать свои SQL-запросы с помощью инструмента просмотра SQL (например, phpMyAdmin) перед реализацией функции CustomQuery. Это сэкономит вам много времени и средств на отладку. - person yannicuLar; 02.06.2013