2010-09-23 3 views
4

У меня есть два объекта (Dataset и Item), где первый содержит список последнего.JPA 2 + Criteria API + получить самый старый элемент в подзапросе

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

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

Я сейчас ищу любой набор данных, который ссылается на элемент с как старого элемента someCriteria = «х» в списке набора данных (это дата раньше всех остальных, на которые ссылается этот Набор данных).

Это должно работать с 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?

+0

Я не верю, что для такого рода проблем нет решения. Никто не имеет идеи? – Jan

ответ

6

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

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

+1

CriteriaBuilder не является частью Java 6 (= Java 1.6), а JPA 2.0, который сам по себе является частью Java EE 6. В Java 5 (= Java 1.5) отсутствует API критериев (и, как таковой, нет CriteriaBuilder), JPA 1 или Java EE 5. – ymajoros