gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:17:33 25 4
gpt4 key购买 nike

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

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

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

我现在正在寻找任何数据集,它在数据集的列表(它的日期早于该数据集引用的所有其他日期。

这应该可以与 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 不允许在子查询(或连接)中排序(据我所知)。我的第二个想法是获取 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 中做到这一点?

最佳答案

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

在 Java 1.5 中,如果没有数据库中的附加字段,似乎无法实现它。

关于java - JPA 2 + Criteria API + 获取子查询中最旧的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3778252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com