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

如何使用实体管理器使用查询将值插入数据库,使用java类进行持久化?,java,jpa,jakarta-ee,Java,Jpa,Jakarta 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.creat

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

    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操作的Servlet.service()引发异常 org.hibernate.hql.ast.QuerySyntaxException:在第1行第19列[插入用户值('pawan','am')附近,应为打开的、找到的'values']


这不是真正的方式。您试图在表中插入一行,但没有关联的附加实体。如果您正在使用JPA实体管理器-然后创建一个新实例-设置属性并持久化实体

例如

User u=新用户();
u、 setXXX(xx);
em.persist(u);

//em.flush()您使用的不是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;
}
试一试

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

编辑至@aman_新手评论: 把它放在你的课堂上

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

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

如何将pwd与usr一起插入用户表?PK将仅根据生成策略进行设置。i、 e.@GeneratedValue(策略=GenerationType.AUTO)注释或类似注释。一般来说,依赖声明性txn边界也更好。是真的…我的错..用SQL编写。但是,我想指出User()是一个无参数构造函数。所以我不能创建那个对象!!!:(@aman_新手:好的,然后使用setter方法设置用户名和密码。我认为用户类的标识符类型会出现问题。需要确保实体上的id类型是字符串。这会起作用-但不常见。:-)谢谢我一直在寻找类似的东西+1 :-)
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;
}
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;
}
//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();
(...)