JPA 2 - Использование @ElementCollection в CriteriaQuery - PullRequest
7 голосов
/ 14 сентября 2010
    @Entity
    public class Person {

        @ElementCollection
        private List<Location> locations;

        [...]

    }

    @Embeddable
    public class Location {

        private Integer dummy;

        private Date creationDate;

        [...]

    }

Учитывая следующую структуру, я хотел бы выполнить HQL или CriteriaQuery, эквивалентный следующему SQL:

SELECT
    l.*
FROM
    Location l
INNER JOIN
    Person p ON (p.id = l.person_id)
WHERE
    p.id = ? AND l.creationDate > ?

Я хочу получить обратно список местоположений, связанных с данным человеком, чья creationDate находится после указанного.

Заранее спасибо!

Mark

Редактировать ***: я редактировал SQL, так как он вводил в заблуждение. Я не хочу запрашивать местоположения самостоятельно.

Ответы [ 2 ]

16 голосов
/ 14 сентября 2010

Это невозможно, вы не можете запросить Embeddable.Из JPA Wikibook:

Встроенные коллекции

Отображение ElementCollection можно использовать для определения коллекции Embeddable объектов.Это не типичное использование объектов Embeddable, поскольку объекты не внедряются в таблицу исходного объекта, а хранятся в отдельной таблице сбора.Это похоже на OneToMany, за исключением того, что целевой объект - Embeddable вместо Entity.Это позволяет легко определять коллекции простых объектов, не требуя, чтобы простые объекты определяли обратное отображение Id или ManyToOne.ElementCollection также может переопределять сопоставления или таблицу для их коллекции, поэтому вы можете иметь несколько сущностей, ссылающихся на один и тот же класс Embeddable, но каждый из которых может хранить свои зависимые объекты в отдельной таблице.ElementCollection вместо OneToMany означает, что целевые объекты не могут быть запрошены , сохранены, объединены независимо от их родительского объекта.Они являются строго частными (зависимыми) объектами, так же, как отображение Embedded.На ElementCollection отсутствует каскадная опция, целевые объекты всегда сохраняются, объединяются, удаляются вместе со своим родителем.ElementCollection все еще может использовать тип выборки и по умолчанию LAZY, как и другие сопоставления коллекций.

Для достижения того, что вы хотите, используйте OneToMany и Entity вместо ElementCollection и Embeddable.Или измените свой подход и запросите Person.

2 голосов
/ 02 сентября 2012

Ключевая фраза в ответе Паскаля:

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

Поскольку вы зависите от родительского объекта, вы должны быть в состоянии сделать это, используя что-то вроде ...

SELECT p FROM PERSON, IN (p.locations) WHERE p.id = ?1 AND locations = ?2

(Основано на ответе на Выполнить запрос «MEMBER OF» для полей карты «ElementCollection» в JP-QL (JPA 2.0) - фактически это Map @ElementCollection, именно то, что я искал ответ!)

...