Использование ключевого слова DISTINCT в JPA для отдельных столбцов

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

Есть ли способ использовать ключевое слово DISTINCT в JPA для отдельных столбцов? Это то, что у меня сейчас есть для запроса:

String jpql = "SELECT DISTINCT annoucement FROM Announcment announcement "
                + "WHERE (announcement.date <= :now AND announcement.endDate >= :now) "
                + "AND announcement.approved = true AND announcement.departmentId IN (:departmentIDs)";

TypedQuery<Announcement> query = entityManager.createQuery(jpql,
                Announcement.class);
query.setParameter("now", new Date());
query.setParameter("departmentIDs", departmentIDs);

ЗначениеdepartmentID может быть другим, но объявление, даты и т. д. идентичны. Этот запрос возвращает объявления с повторяющимися значениями.


person acvcu    schedule 10.02.2012    source источник
comment
вы случайно не знаете JPA, какую версию вы используете?   -  person Bhushan    schedule 10.02.2012
comment
Hibernate 3.6.6 и hibernate-jpa-2.0-api-1.0.1.Final.jar   -  person acvcu    schedule 10.02.2012


Ответы (2)


два способа решить вашу проблему:

  1. "выбрать отдельный annoucement.x, annoucement.y, annoucement.z...(без depId) из..."

    затем составить объявление. но вы потеряли постоянный объект и его ссылки. вам нужно загрузить их снова с помощью ваших объектов Dao, если вам нужно.

  2. переопределить equals() [тоже hashCode()] в вашем классе Annoucement, конечно, в equals() depId не должен сравниваться. получить список, как вы это сделали, а затем преобразовать список в Set. у вас есть "отличные" объекты

Надеюсь, поможет

person Kent    schedule 10.02.2012
comment
Мне потребовалось некоторое время, но я вернулся и исправил это, используя предложение № 2. Спасибо. - person acvcu; 16.03.2012

На мой взгляд, лучшим подходом является возврат более конкретного объекта, содержащего только интересующие вас столбцы. См. также следующий ответ:

Выражение конструктора JPQL - org.hibernate.hql.ast.QuerySyntaxException: Таблица не сопоставлена

В соответствии с вашим примером вы можете создать новый объект только с интересующими вас столбцами:

SELECT DISTINCT new com.mypackage.MyInterestingAnnouncement(annoucement.x, annoucement.y, annoucement.z) FROM Announcment annoucement
person finrod    schedule 29.06.2017