JPA 2 + Criteria API + получить самый старый элемент в подзапросе

У меня есть две сущности (Dataset и Item), где первая содержит список последней.

@Entity
class Dataset {
    @Id long id;
    List<Item> items;
}

@Entity
class Item {
    @Id long id;
    @Temporal Date date;
    String someCriteria;
}

Теперь я ищу любой набор данных, который ссылается на элемент с someCriteria = 'x' как самый старый элемент в списке набора данных (дата перед всеми другими, на которые ссылается этот набор данных).

Это должно работать с Criteria API JPA-2.0, но ответ в виде SQL-запроса тоже подойдет.

Вот как это выглядит прямо сейчас:

Subquery<Item> _subquery = p_criteria.subquery(Item.class);
Root<Item> _itemRoot = _subquery.from(Item.class);
_subquery.select(_itemRoot);

// correlate
_subquery.correlate(_datsetRoot);

// type check
Predicate _typeP = p_builder.equal(_itemRoot.get(Item_.someCriteria), "x");

<additional predicates>
...

// reference check
_subquery.where(_typeP);

return p_builder.exists(_subquery);

Я думал о создании подзапроса, упорядочиваю его по дате и проверяю первый. К сожалению, JPA-2.0 не позволяет упорядочивать подзапросы (или соединения) (насколько я понимаю). Моей второй идеей было получить MAX(date), который должен поддерживаться большинством баз данных. То же самое и здесь, поддержка MAX, ABS, ... доступна только для чисел.

EDIT: Используя отсортированный подзапрос, это будет выглядеть так (MSSQL):

SELECT d.id
FROM Dataset d
WHERE EXISTS (
 SELECT TOP 1 *
 FROM Item i
 WHERE i.dataset_id = d.FALL_ID
    AND i.someCriteria = 'x'
 ORDER BY i.date
)
ORDER BY d.FALL_ID

(Как) я могу сделать это в JPA-2.0?


person Jan    schedule 23.09.2010    source источник
comment
Я не верю, что у такой проблемы нет решения. Ни у кого нет идей?   -  person Jan    schedule 11.10.2010


Ответы (1)


В Java 1.6 есть методы CriteriaBuilder.least(expression) (вместо min()) и CriteriaBuilder.lessThanOrEqualTo(expressionA, expressionB) (вместо le()), которые работают для полей java.util.Date.

В Java 1.5 кажется, что без дополнительных полей в БД это невозможно.

person Jan    schedule 24.11.2010
comment
CriteriaBuilder не является частью Java 6 (= Java 1.6), а является частью JPA 2.0, которая сама является частью Java EE 6. В Java 5 (= Java 1.5), JPA 1 нет Criteria API (и, соответственно, CriteriaBuilder). или JavaEE 5. - person ymajoros; 30.04.2013