web-dev-qa-db-fra.com

Comment insérer des valeurs dans la base de données à l'aide de requêtes à l'aide du gestionnaire d'entités, persistance à l'aide d'une classe Java?

Je veux insérer des données dans une table en utilisant le code suivant

    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;

}

ici 'u 'est l'objet de User classe et em est EntityManager.

Je reçois cette exception suivante:

Servlet.service () pour l'action de servlet a renvoyé une exception org.hibernate.hql.ast.QuerySyntaxException: attente de OPEN, 'valeurs' trouvées près de la ligne 1, colonne 19 [insérer dans les valeurs utilisateur ('pawan', 'am')]

10
aman_novice

Essayer

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;
}

Si la PK est Identity, elle sera automatiquement définie dans votre classe persistante, si vous utilisez la stratégie de génération automatique (grâce à David Victor).

Modifier à @aman_novice commentaire: Le définir dans votre classe

//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();
(...)

À propos de @ David Victor, désolé j'ai oublié à ce sujet.

16
Renan

Vous n'utilisez pas SQL mais JPAQL, il n'y a pas d'insertion basée sur les champs. Vous persistez objet plutôt que d'insérer des lignes.

Vous devriez faire quelque chose comme ça:

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;
}
5
Michael Borgwardt

Ce n'est pas vraiment la voie à suivre. Vous essayez d'insérer une ligne dans une table mais aucune entité attachée n'est associée. Si vous utilisez le gestionnaire d'entités JPA - créez ensuite une nouvelle instance - définissez les propriétés et conservez l'entité.

Par exemple.

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

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

// etc..

Si vous activez la journalisation SQL dans Hibernate et purgez l'entité, vous verrez ce qui est envoyé à la base de données.

Par exemple. dans persistence.xml:

    <property name="hibernate.format_sql" value="true" />
0
David Victor