小编EJJ*_*EJJ的帖子

在Hibernate JPA 2中使用子查询进行ORDER BY

我正在hibernate-jpa-2.1中将NamedQuery重写为CriteriaQuery。原始的NamedQuery包含一个order by子句,该子句引用别名的子查询。

select new ItemDto ( item.id, item.number, (select count(*) from ClickEntity as click where click.item.id = item.id) as clickCount ) from ItemEntity as item order by clickCount desc

我找不到任何使用别名来引用clickCount字段的方法,因此我认为我也可以在两个地方都使用子查询:

public List<ItemDto> getItems() {
    ...
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<ItemDto> query = criteriaBuilder.createQuery(ItemDto.class);
    Root<ItemEntity> item = query.from(ItemEntity.class);

    query
        .select(
            cb.construct(ItemDto.class,
                item.get("id"),
                item.get("number"),
                getClickCount(cb, query, item).getSelection()
            )
        )
        .orderBy(cb.desc(getClickCount(cb, query, item).getSelection()))

    TypedQuery<ItemDto> typedQuery = entityManager.createQuery(query);
    return typedQuery.getResultList();
}

private Subquery<Long> getClickCount(CriteriaBuilder cb, CriteriaQuery<ItemDto> query, Root<ItemEntity> item) {
    Subquery<Long> subquery …
Run Code Online (Sandbox Code Playgroud)

hibernate jpa-2.0

5
推荐指数
1
解决办法
1588
查看次数

标签 统计

hibernate ×1

jpa-2.0 ×1