Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hibernate中的CRUD导致表未映射异常_Java_Hibernate_Hql - Fatal编程技术网

Java hibernate中的CRUD导致表未映射异常

Java 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

我试图在hibernate中实现CRUD操作。但是我得到了表未映射错误。而且,在我的代码中,查询已经被弃用了。 据我所知,表的映射只是以这种方式完成的。那么,这里的问题是什么

代码

错误

配置类是

teacher.hbm.xml


在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();