Представление JPQL, возвращающее дубликаты

#database #jpa #view #duplicates #jpql

#База данных #jpa #Вид #дубликаты #jpql

Вопрос:

Я создал объект Java (в Eclipse) на основе представления, которое я настроил в своей базе данных. Настройка объекта работает так, как было протестировано на моем сервере glassfish, а также через запущенное мной приложение flex, которое ссылается на методы и классы в развернутом веб-сервисе.

Единственная проблема в том, что количество строк указано правильно, но все возвращаемые значения являются дубликатами! Я не могу понять, почему это происходит, и почти ничего не нашел о ссылочных представлениях в сети, кроме того, что оно должно работать почти так же, как table…it делает, но возвращает дубликаты!

В качестве теста я создал таблицу со всеми теми же столбцами / данными и т.д., что и в представлении, и указал на это объекту JPA — voila…no дубликаты!

Кто-нибудь знает, что я здесь делаю не так, пожалуйста?

Вот код!

 EntityManager em = null;
BigDecimal pId = new BigDecimal(conId);


try {
em = emf.createEntityManager();
String applicationQueryString = "select c from VDisc c where c.dCorId = :conId";

Query contdetQuery = em.createQuery(applicationQueryString);
contdetQuery.setParameter("conId",pId);

List list = contdetQuery.getResultList();
VDisciplines[] disc = new VDisciplines[list.size()];
disc = (VDisciplines[]) list.toArray(disc);

return disc;
  

Ответ №1:

Как вы сопоставили свою сущность с представлением и что вы определили в качестве идентификатора? Также, как вы определяете / выполняете запрос?

Если вы определите какое-то поле, которое не было уникальным в качестве идентификатора, то вы получите повторяющиеся объекты с тем же идентификатором.

Вы могли бы попробовать использовать собственный SQL-запрос для необработанных данных, чтобы убедиться, что они правильно возвращаются из базы данных.

Комментарии:

1. Джеймс — спасибо, что перезвонил мне, приятель. Я подумал, что это может быть связано с идентификатором… Мне пришлось удалить аннотацию @Id, потому что каждый раз, когда я запускал свой запрос «выберите c из VDisc c, где c.dCorId = :conId», он продолжал говорить, что не знает, какое поле «ID» было в запросе select, как в «ВЫБЕРИТЕ ID, CON_ID …». Я предполагаю, что это связано с этим? Проблема в том, что, поскольку это представление, в представлении нет уникального идентификатора, просто смесь идентификаторов и имен, которые были объединены вместе!

2. Включите ваш класс VDisc, у него все еще должен быть @Id, иначе вы получите сообщение об ошибке. Если в представлении действительно нет уникального набора полей, то отметьте все свои атрибуты с помощью @Id.