2009-09-28 2 views
1

Я должен быть действительно глупым, но я нахожусь в своем решении с проблемой JPA, используя MyEclipse 7.5.Созданный мастером метод JPA DAO не возвращает итерируемый список

Я получаю доступ к базе данных DB2 (на AS400) через JPA. У меня есть обратная конструкция простой таблицы для предоставления DAO с некоторыми методами «поиска». Все идет нормально.

Если я бег ЗЕЬЕСТА над столом, таким образом, я получаю 4 строки:

SELECT * FROM MyTable WHERE MyValue = '1234' 

Однако, если я пытаюсь получить доступ к этой же 4 записи с помощью JPA, я получаю список, это правильный размер (4), но содержит 4 объекта, которые все же, все копии первого объекта найдено:

List <MyTableObject> objects = dao.findByMyValue("1234"); 

Это почти как если внутренний объект запроса, что класс DAO создает не может перебирать строки данные. Я изменил файл reveng.xml со множеством способов, и я поработал с созданным DAO, но я никуда не уйду. Я пропустил что-то действительно очевидное здесь? Я просто хочу получить список объектов таким же образом, что обычный оператор SELECT возвращает набор результатов!

(Это MyEclipse 7.5, используя Hibernate 3.2 и связанную с ним библиотеку JPA).

UPDATE: вот сгенерированный код, который findByMyValue() переходит к (Логгина/TRY прилов удалены для ясности):

@SuppressWarnings("unchecked") 
public List<PolicyStatFile> findByProperty(String propertyName, final Object value) 
{ 
    final String queryString = "select model from MyTableObject model where model." + propertyName + "= :propertyValue"; 
    Query query = getEntityManager().createQuery(queryString); 
    query.setParameter("propertyValue", value); 
    return query.getResultList(); 
} 

FINAL UPDATE Это было все о модели: см комментарии к эта почта. По сути, модель, созданная из файла обратной инженерии, была недействительной, потому что у меня не было действительно уникального ключа. Как только я решил это (подкрепленный комментариями здесь), все было хорошо.

+1

Можете ли вы опубликовать источник для метода 'findByMyValue()', а также запроса, который он использует (если есть)? – ChssPly76

+0

Спасибо, что ответили! Я обновил исходное сообщение с помощью источника – Ben

ответ

1

Метод, который вы опубликовали, выглядит корректно (хотя для всех свойств это кажется бессмысленным). Пара вещей, которые необходимо проверить:

  1. Является ли свойство MyValue, о котором вы упоминали, непосредственно привязано к вашей сущности (например, к столбцу в той же таблице, не связаны никакие ассоциации)?
  2. Можете ли вы включить отладку Hibernate SQL (установите для свойства «hibernate.show_sql» значение true в вашей конфигурации) и проверьте, как выглядит сгенерированный запрос?
  3. Являются ли 4 объекта одинаковыми (например, '==' друг другу) или являются ли они копиями друг друга (например, имеют одинаковые значения свойств)?

Можете ли вы опубликовать свое сопоставление для рассматриваемого объекта и сгенерированного SQL из # 2 выше?

+0

Ваш третий момент заставил меня задуматься о действительно уникальных ключах и т. Д. Я обнаружил проблему, указав некоторые дополнительные значения в базовой таблице, которые могли бы создать правильный уникальный ключ. Я использовал файл регенерации по умолчанию, чтобы использовать его, и, эй, предварительно, модель данных, сгенерированная Hibernate, теперь работает так, как ожидалось! Спасибо за советы - я ценю ваше время, чтобы помочь идиоту найти свой путь ;-) – Ben

1

Я подозреваю, что вы не переопределили hashCode() и equals() в свой объект JPA (например, MyTableObject). Таким образом, Hibernate не может отличить возвращающиеся строки. Это выглядит here.

+0

Мне вообще не пришло в голову, но это действительно правда, я благодарен! Я проверю это и уточню здесь с выводами. Спасибо, что ответили! – Ben

+1

Это неверно. hashCode()/equals() не имеет никакого отношения к результатам запроса. – ChssPly76

+0

Хотя в этом случае equals() и hashcode() не были ответом, ответ Р. Кеттелирия заставил меня задуматься о составных ключах, которые были построены в файле reveng, и я решил свою проблему - группировка по умолчанию была неправильной (не подлинно уникальный ключ), поэтому Hibernate не смог построить «правильную» модель. Спасибо вам обоим! – Ben