我有两个实体(Dataset和Item),其中第一个实体包含一个后一个实体的列表。
@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查询的答案也可以。
这就是现在的样子:
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中做到这一点?
发布于 2010-11-24 11:09:55
Java1.6中有CriteriaBuilder.least(expression) (而不是min())和CriteriaBuilder.lessThanOrEqualTo(expressionA, expressionB) (代替le())的方法,它们适用于java.util.Date字段。
在Java1.5中,如果没有DB中的其他字段,似乎就无法实现它。
https://stackoverflow.com/questions/3778252
复制相似问题