Как вставить значения в базу данных с помощью запросов с помощью диспетчера сущностей, постоянство с помощью класса Java? - PullRequest
10 голосов
/ 11 февраля 2011

Я хочу вставить данные в таблицу, используя следующий код

    public User registerUser(String usr, String pwd) {

    u=em.find(User.class,usr);
    if(u!=null)
    {
        return null;
    }
    String query1 = "insert into users values('" + usr + "','" + pwd +"')";
    Query q = em.createQuery(query1);
    u=em.find(User.class,usr);
    return u;

}

здесь 'u '- объект класса User, а em - EntityManager.

Я получаю следующее исключение:

Servlet.service () для действия сервлета сгенерировал исключение org.hibernate.hql.ast.QuerySyntaxException: ожидается ОТКРЫТО, найдены «значения» возле строки 1, столбец 19 [вставить в пользовательские значения («pawan», «am»)]

Ответы [ 3 ]

16 голосов
/ 11 февраля 2011

Попробуйте

public User registerUser(String usr, String pwd) {

    u=em.find(User.class,usr);
    if(u!=null)
    {
        return null;
    }

    //Now saving...
    em.getTransaction().begin();
    em.persist(u); //em.merge(u); for updates
    em.getTransaction().commit();
    em.close();

    return u;
}

Если в качестве PK выбран Identity, он будет установлен автоматически в вашем постоянном классе, если вы используете стратегию автоматического создания (спасибо Дэвиду Виктору).

Изменить на комментарий @aman_novice: установите его в своем классе

//Do this BEFORE getTransaction/persist/commit
//Set names are just a example, change it to your class setters
u.setUsr(usr);
u.setPwd(pwd);

//Now you can persist or merge it, as i said in the first example
em.getTransaction().begin();
(...)

О @ Дэвид Виктор, извини, я забыл об этом.

5 голосов
/ 11 февраля 2011

Вы используете не SQL, а JPAQL, вставка на основе полей отсутствует.Вы сохраняете объект, а не вставляете строки.

Вы должны сделать что-то вроде этого:

public User registerUser(String usr, String pwd) {
    u=em.find(User.class,usr);
    if(u!=null)
    {
        return u;
    }
    u = new User(usr, pwd);
    em.persist(u);
    return u;
}
0 голосов
/ 11 февраля 2011

На самом деле это не тот путь.Вы пытаетесь вставить строку в таблицу, но у вас нет связанной прикрепленной сущности.Если вы используете диспетчер сущностей JPA - затем создайте новый экземпляр - задайте свойства и сохраните сущность.

Например:

User u = new User();
u.setXXX(xx);

em.persist(u);
// em.flush()   <<-- Not required, useful for seeing what is happening

// etc..

Если вы включаете ведение журнала SQL в Hibernate и очищаетесубъект, тогда вы увидите, что отправляется в базу данных.

Например, в persistence.xml:

    <property name="hibernate.format_sql" value="true" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...