首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA 2+条件API +在子查询中获取最古老的元素

JPA 2+条件API +在子查询中获取最古老的元素
EN

Stack Overflow用户
提问于 2010-09-23 12:18:10
回答 1查看 6.2K关注 0票数 4

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

代码语言:javascript
复制
@Entity
class Dataset {
    @Id long id;
    List<Item> items;
}

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

我现在正在寻找any dataset,它将具有someCriteria = 'x'的项引用为数据集列表中最老的项(它的日期早于此数据集引用的所有其他项的日期)。

这应该适用于JPA-2.0的标准API,但是作为SQL查询的答案也可以。

这就是现在的样子:

代码语言:javascript
复制
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):

代码语言:javascript
复制
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中做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-24 11:09:55

Java1.6中有CriteriaBuilder.least(expression) (而不是min())和CriteriaBuilder.lessThanOrEqualTo(expressionA, expressionB) (代替le())的方法,它们适用于java.util.Date字段。

在Java1.5中,如果没有DB中的其他字段,似乎就无法实现它。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3778252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档