我有下一个查询:
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。我想在查询中处理这个,所以它不会返回损坏的数据。有什么办法吗?
由于
答案 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