如何使用实体管理器使用查询将值插入数据库,使用java类进行持久化?

ama*_*ice 10 java jpa java-ee

我想使用以下代码将数据插入表中

    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;
Run Code Online (Sandbox Code Playgroud)

}

这里'u'是User阶级的对象,emEntityManager.

我得到以下异常:

用于servlet操作的Servlet.service()抛出异常org.hibernate.hql.ast.QuerySyntaxException:期待OPEN,在第1行第19列附近找到'values'[插入用户值('pawan','am')]

Ren*_*nan 16

尝试

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;
}
Run Code Online (Sandbox Code Playgroud)

如果PK是Identity,如果您使用自动生成策略,它将在您的持久化类中自动设置(感谢David Victor).

编辑为@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();
(...)
Run Code Online (Sandbox Code Playgroud)

关于@David Victor,对不起我忘记了.


Mic*_*rdt 5

您没有使用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;
}
Run Code Online (Sandbox Code Playgroud)