2014-11-11 5 views
0

У меня есть следующий запрос:ObjectNotFoundException: Ни в одной строке с данным идентификатором не существует 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 

Дело в том, что у меня есть некоторые поврежденные данные, поэтому у «Visit» иногда есть id в «pdv», но не существует этого pdv в таблице «PDV». Я хотел бы обработать это в запросе, чтобы он не возвращал поврежденные данные. Там в любом случае?

Благодаря

ответ

0

В спящий режим при е вы используете присоединиться HQL возвращает список так, пожалуйста, отдать свой обратный satement как возвращение

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

и Retrun типа, как

List<Object[]> 

и ваш вопрос попробуйте вот так

выбрать vis fro м Визит визави, PDV PDV где vis.id = pdv.vis.id

этот запрос будет возвращать

List<Visit> 
+0

Спасибо. У меня нет в Pdv ссылки на Visit, просто ссылка в Visit to Pdv – Juanjo

+0

Жаль, что я не получаю, вы имеете в виду Визит - это детская таблица Pdv? ключ Pdv находится в Визите или просто ссылка без ограничения внешнего ключа – mady

+0

это было!(ваш главный ответ) спасибо;) – Juanjo

1

Там Похожая проблема здесь: org.hibernate.ObjectNotFoundException: No row with the given identifier exists: Single table query

В принципе ответ: вам нужно иметь согласованную базу данных до того, как Hibernate сможет работать с данными.

Я понял, что у вас есть столбец Visit.pvd, который является внешним ключом в таблице PVD, но содержит данные, которые не отражаются на PVD. Это нарушение вашей целостности. Что вы можете сделать, это bypassing Hibernate и собирать любые Visit.id S, которые идентифицирующие объекты, которые являются недопустимыми:

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

Это получает вас List<Object[]>, что вы можете перебирать, чтобы получить обижая объекты. Используйте это для UPDATE, чтобы они не содержали недопустимых ссылок (или просто использовали простой UPDATE с предложением WHERE).

0

Строка QueryString = "от посещения ВИС" + "LEFT OUTER JOIN FETCH vis.pdv"; return query.list();

вам не нужно List<Object[]> как ваше возвращение List<Visit>

List<Object[]> 

необходима, когда вы возвращаете несколько объектов из запроса.

eg select v.pid,v.pname,v.pvisit from Visit v

Смежные вопросы