У меня есть два объекта (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?
Я не верю, что для такого рода проблем нет решения. Никто не имеет идеи? – Jan