Jan*_*Jan 4 java hibernate criteria-api jpa-2.0
我有两个实体(Dataset和Item),第一个实体包含后者的列表.
@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中这样做吗?
在Java 1.6中,有一些方法CriteriaBuilder.least(expression)(而不是min())和CriteriaBuilder.lessThanOrEqualTo(expressionA, expressionB)(而不是le()),它们适用于java.util.Date字段.
在Java 1.5中,似乎没有办法在没有DB中的其他字段的情况下实现它.
| 归档时间: |
|
| 查看次数: |
5853 次 |
| 最近记录: |