ObjectNotFoundException:没有具有给定标识符的行存在Hibernate

时间:2014-11-11 09:52:16

标签: java hibernate

我有下一个查询:

String queryString = "from Visit vis "
                    + "LEFT OUTER JOIN FETCH vis.pdv vis_pdv ";
return query.list();

之后,当我尝试访问某些pdv时,我收到下一个错误:

nested exception is org.hibernate.ObjectNotFoundException: No row with the given identifier exists

关键是我有一些损坏的数据,所以“访问”有时在“pdv”中有一个id但在“PDV”表中不存在pdv。我想在查询中处理这个,所以它不会返回损坏的数据。有什么办法吗?

由于

3 个答案:

答案 0 :(得分:1)

这里有类似的问题:org.hibernate.ObjectNotFoundException: No row with the given identifier exists: Single table query

基本上答案是:在Hibernate处理数据之前,您需要拥有一致的数据库。

我知道您的Visit.pvd列是PVD表中的外键,但包含的数据并未反映在PVD中。那是你的诚信违规行为。您可以做的是bypassing Hibernate并收集任何标识无效实体的Visit.id

session.createSQLQuery("SELECT id FROM Visit "
        + "WHERE pvd NOT IN (SELECT p.id FROM pvd)").list();

这会让你获得一个List<Object[]>,你可以迭代来获取有问题的实体。使用它来UPDATE它们不包含无效的引用(或者只使用我给出的UPDATE子句的普通WHERE

答案 1 :(得分:0)

在hibernate中,你在HQL中使用join它会返回List,所以请将你的返回声明作为return返回

List<Object[]> query.list(); 

并将后退类型改为

List<Object[]>

并提出您的问题 试试这个

从Visit vis,Pdv pdv中选择vis,其中vis.id = pdv.vis.id

此查询将返回

List<Visit>

答案 2 :(得分:0)

  

String queryString =“来自Visit vis”                       +“LEFT OUTER JOIN FETCH vis.pdv”;   return query.list();

您不需要List<Object[]>作为返回的List<Visit>

List<Object[]>
从查询中返回多个对象时需要

例如select v.pid,v.pname,v.pvisit from Visit v