У меня есть две сущности (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?