我想使用以下代码将数据插入表中
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:期待OPEN,在第1行第19列附近找到'values'[插入用户值('pawan','am')]
答案 0 :(得分: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;
}
如果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();
(...)
关于@David Victor,抱歉,我忘记了这一点。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
这不是真正的方法。您正尝试在表中插入一行但没有关联的附加实体。如果您正在使用JPA实体管理器 - 然后创建一个新实例 - 设置属性&坚持实体。
E.g。
User u = new User();
u.setXXX(xx);
em.persist(u);
// em.flush() <<-- Not required, useful for seeing what is happening
// etc..
如果在Hibernate&amp;中启用SQL loggging。刷新实体,然后您将看到发送到数据库的内容。
E.g。在persistence.xml中:
<property name="hibernate.format_sql" value="true" />