4

我有两个实体(DatasetItem),其中第一个包含后一个的列表。

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

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

我现在正在寻找任何 dataset,它引用了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);

我想创建一个子查询,按日期排序并检查第一个。不幸的是,JPA-2.0 不允许在子查询(或连接)中排序(据我所知)。我的第二个想法是getting 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

(如何)我可以在 JPA-2.0 中做到这一点吗?

4

1 回答 1

6

在 Java 1.6 中有用于 java.util.Date 字段的方法CriteriaBuilder.least(expression)(代替min())和CriteriaBuilder.lessThanOrEqualTo(expressionA, expressionB)(代替)。le()

在 Java 1.5 中,如果没有 DB 中的附加字段,似乎没有办法实现它。

于 2010-11-24T11:09:55.950 回答