Вставка с собственным запросом Hibernate не работает для java.util.Date - PullRequest
5 голосов
/ 01 марта 2011

Я использую Hibernate JPA и Spring с базой данных Mysql, и я хочу вставить с помощью оператора SQL, например:

Date saveDate = new Date();
java.sql.Timestamp timeStampDate = new Timestamp(saveDate.getTime());
Query persistableQuery = entityManager.createNativeQuery("INSERT INTO TASK_ASSESSMENT (ACTIVE_FLAG, ASSESSMENT_DATE, DESCRIPTION, "
        + "TITLE, NEEDS_LEVEL_ID, PATIENT_ID, USER_ID) VALUES ("
        + true +", " + timeStampDate + ", " + description + ", " + title + ", "
        + needsLevelId + ", " + patientId + ", " + userId + " )");
persistableQuery.executeUpdate();

Но после запуска я получаю следующую ошибку:

WARN : org.hibernate.util.JDBCExceptionReporter - SQL Error: -11, SQLState: 37000
ERROR: org.hibernate.util.JDBCExceptionReporter - Unexpected token: 15 in statement
    [INSERT INTO TASK_ASSESSMENT (ACTIVE_FLAG, ASSESSMENT_DATE, DESCRIPTION, TITLE,
    NEEDS_LEVEL_ID, PATIENT_ID, USER_ID)
    VALUES (true, 2011-03-01 15?, any description, , 193, 1, 3 )]

Может ли кто-нибудь помочь мне в этом, пожалуйста?

PS. Я знаю об использовании гибернации не родным способом, но мне нужно использовать нативный способ. Я тоже из ... от ... но не думаю, что это поможет.

Наконец, я думаю, что проблема в основном с датой. Как вы, ребята, передаете MySQL тип datetime с использованием Java?

Обновление:

Следующее работает нормально, я полагаю, что это проблема преобразования даты и времени в mysql из java.

("INSERT INTO TASK_ASSESSMENT "
     + "(ACTIVE_FLAG, ASSESSMENT_DATE, DESCRIPTION, TITLE, "
     + "NEEDS_LEVEL_ID, PATIENT_ID, USER_ID) "
     + "VALUES (true, 1999-12-22, '" + description + "', '" 
     + title + "', " + needsLevelId+", " + patientId 
     + ", " + userId + ")");

Может кто-нибудь помочь мне, как конвертировать java.util.Date в MySQL datetime?

Ответы [ 3 ]

13 голосов
/ 01 марта 2011

Не используйте конкатенацию для вставки данных в запросы, вместо этого используйте параметры. Это решает проблему с неправильным представлением значений, а также многие другие проблемы:

entityManager.createNativeQuery(
    "INSERT INTO TASK_ASSESSMENT (ACTIVE_FLAG, ASSESSMENT_DATE, DESCRIPTION, "
    + "TITLE, NEEDS_LEVEL_ID, PATIENT_ID, USER_ID) VALUES (?, ?, ?, ?, ?, ?, ?)")
    .setParameter(1, true)
    .setParameter(2, saveDate, TemporalType.TIMESTAMP) // Since you want it to be a TIMESTAMP
    .setParameter(3, description)
    .setParameter(4, title)
    .setParameter(5, needsLevelId)
    .setParameter(6, patientId)
    .setParameter(7, userId) 
    .executeUpdate();
0 голосов
/ 13 февраля 2014

Вы можете отправить параметр в методе save, или что вы используете и использовать именованные запросы SQL

 Query persistableQuery = entityManager.createNativeQuery("INSERT INTO TASK_ASSESSMENT (ACTIVE_FLAG, ASSESSMENT_DATE, DESCRIPTION, TITLE, NEEDS_LEVEL_ID, PATIENT_ID, USER_ID) VALUES (":active_flag",":timeStampDate", ":description", ":title", ":needsLevelId", ":patientId", ":userId" )").setParameter("active_flag", your_object.getactive_flag).setParametr and etc<br>
persistableQuery.executeUpdate();
, но где-то создать объект со всеми этими полями.
0 голосов
/ 01 марта 2011

Похоже на несколько вопросов. Некоторые из ваших полей должны иметь кавычки вокруг них. Кроме того, возможно, вам нужно отформатировать метку времени другим способом, не знаете, как MySQL ожидает это?

Query persistableQuery = entityManager.createNativeQuery(
    "INSERT INTO TASK_ASSESSMENT 
        (ACTIVE_FLAG, ASSESSMENT_DATE, DESCRIPTION, "
    + "TITLE, NEEDS_LEVEL_ID, PATIENT_ID, USER_ID) VALUES ("
        + true +", " 
    + "'" + timeStampDate + "'"
    + ", " 
    + "'" + description + "'"
    + ", " 
    + "'" + title + "'"
    + ", "                                                            
    + "'" + needsLevelId + "')");

Что касается форматирования даты, я подозреваю, что вам нужно будет взглянуть на класс SimpleDateFormat, который позволит вам получить дату в любом формате, который ожидает mysql. Смотри http://download.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html

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