Java hibernate中的CRUD导致表未映射异常
我试图在hibernate中实现CRUD操作。但是我得到了表未映射错误。而且,在我的代码中,查询已经被弃用了。 据我所知,表的映射只是以这种方式完成的。那么,这里的问题是什么 代码 错误 配置类是 teacher.hbm.xmlJava hibernate中的CRUD导致表未映射异常,java,hibernate,hql,Java,Hibernate,Hql,我试图在hibernate中实现CRUD操作。但是我得到了表未映射错误。而且,在我的代码中,查询已经被弃用了。 据我所知,表的映射只是以这种方式完成的。那么,这里的问题是什么 代码 错误 配置类是 teacher.hbm.xml 在HQL中,必须使用类名,而不是表名,因此oyur查询必须: "from Teacher where name="+Name 您还应该使用参数绑定,以防止SQL注入字符串应介于之间,因此您的查询应如下所示: Query query=session.createQuer
在HQL中,必须使用类名,而不是表名,因此oyur查询必须:
"from Teacher where name="+Name
您还应该使用参数绑定,以防止SQL注入字符串应介于之间,因此您的查询应如下所示:
Query query=session.createQuery("from vi where name='" + name + "');
但为了避免任何语法错误或SQL注入,您必须使用:
Query query = session.createQuery("from vi where name=:name");
query.setParameter("name", name);
编辑
为什么不使用:
//no need to select your object before you delete it
//Query query = session.createQuery("from vi where name=" + name);
//Teacher teacher=(Teacher)session.get(Teacher.class, name);
//Teacher teacher = (Teacher) query.getSingleResult();
//just make a delete query directly
String hql = "DELETE FROM vi WHERE name= :name";
Query query = session.createQuery(hql);
query.setParameter("name", name);
int result = query.executeUpdate();
在删除之前避免选择,如果结果为空,则可能会导致此错误。鉴于您的模型,您在此处做出了一些糟糕的假设。您的教师模型使用name和subject的复合键,但您的代码假设按姓名查找教师将得到一行结果,这并不总是正确的 您需要调整数据模型并强制名称在所有教师实体中都是唯一的,这在现实情况下同样没有意义,或者修改删除代码来解释这一点 下面的代码假设Hibernate 5.2,因此可能需要一些小的调整,但前提仍然完全相同:
final List<Teacher> teachers = session
.createQuery( "FROM Teacher t WHERE t.name = :name", Teacher.class )
.setParameter( "name", teacherName )
.getResultList();
for ( Teacher teacher : teachers ) {
session.remove( teacher );
}
在这个场景中,您可以使用返回值deleteCount来记录删除了多少教师,或者如果该值可能不是您期望的值,则可以执行一些特定的代码
最后,虽然其他人指出了使用参数绑定来避免SQL注入的好处,但由于许多其他原因,参数绑定也很重要
例如,绑定参数SQL可以由数据库进行优化、规划和缓存,并在将来的查询中重用。当您直接将实际值引入SQL时,大多数数据库平台都会按原样缓存查询,因此,只有在使用相同的参数提供与以前完全相同的SQL时,您才能获得这一好处 如果我在做类名,那么我会得到ConstraintViolationException@JensConstraintViolationException,这意味着你有一个外键,那不是known@YCF_L谢谢,我不明白我做错了什么,因为我是第一次实现它。请帮助。这是指向我的github存储库@Jenseven的链接,我得到了约束冲突异常。我的github代码的链接是“请帮助”
Query query = session.createQuery("from vi where name=:name");
query.setParameter("name", name);
//no need to select your object before you delete it
//Query query = session.createQuery("from vi where name=" + name);
//Teacher teacher=(Teacher)session.get(Teacher.class, name);
//Teacher teacher = (Teacher) query.getSingleResult();
//just make a delete query directly
String hql = "DELETE FROM vi WHERE name= :name";
Query query = session.createQuery(hql);
query.setParameter("name", name);
int result = query.executeUpdate();
final List<Teacher> teachers = session
.createQuery( "FROM Teacher t WHERE t.name = :name", Teacher.class )
.setParameter( "name", teacherName )
.getResultList();
for ( Teacher teacher : teachers ) {
session.remove( teacher );
}
int deleteCount = session
.createQuery( "DELETE FROM Teacher t WHERE t.name = :name" )
.setParameter( "name", teacherName )
.executeUpdate();