JPA 2 + Criteria API +获取子查询中最旧的元素

Jan*_*Jan 4 java hibernate criteria-api jpa-2.0

我有两个实体(DatasetItem),第一个实体包含后者的列表.

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

@Entity
class Item {
    @Id long id;
    @Temporal Date date;
    String someCriteria;
}
Run Code Online (Sandbox Code Playgroud)

现在我期待的任何数据集,这与引用的项目someCriteria ="X"作为最古老的项目中数据集的列表(它的日期是在此之前,此数据集所引用的所有其他人的).

这应该与JPA-2.0的Criteria API一起使用,但作为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);
Run Code Online (Sandbox Code Playgroud)

我想创建子查询,按日期排序并检查第一个子查询.不幸的是,JPA-2.0不允许在子查询(或连接)中进行排序(据我所见).我的第二个想法是获取MAX(date),大多数数据库应该支持这个想法.同样如此,支持MAX,ABS,......仅适用于数字.

编辑:使用一个已排序的子查询,它看起来像这样(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
Run Code Online (Sandbox Code Playgroud)

(怎么样)我可以在JPA-2.0中这样做吗?

Jan*_*Jan 6

在Java 1.6中,有一些方法CriteriaBuilder.least(expression)(而不是min())和CriteriaBuilder.lessThanOrEqualTo(expressionA, expressionB)(而不是le()),它们适用于java.util.Date字段.

在Java 1.5中,似乎没有办法在没有DB中的其他字段的情况下实现它.