#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.