jpa JPQL/HQL -是否可以通过提供ID列表来指定顺序?

ar7v8xwq  于 2022-11-14  发布在  其他
关注(0)|答案(5)|浏览(146)

(Note:我使用的是Play!框架,它使用Hibernate作为JPA实现。)
我有一个ID列表,我想通过保持ID列表中使用的顺序从数据库中获取项目。
假设我的清单是:444,222,333,111
我希望JPQL/HQL首先返回ID为#444的项目,然后返回ID为#222的项目,依此类推。
我试了一下:

id in (444,222,333,111) order by id=444 DESC, id=222 DESC, id=333 DESC, id=111 DESC

但似乎不起作用。
我是否可能或必须忘记“order by”部分,并在退货后手动重新订购产品?

qyuhtwio

qyuhtwio1#

如果没有“自然”顺序,那么很可能需要手动排序;您 * 可能 * 能够依赖于DB排序(取决于DB和查询结构),但我认为这是有风险的。
从好的方面来说,除非你有大量的对象,否则开销是微不足道的。

wvyml7n5

wvyml7n52#

我想你必须用Java对这些项目进行排序:

public void sortItems(List<Item> items, final List<Long> ids) {
    Collections.sort(items, new Comparator<Item>() {
        @Override
        public int compare(Item i1, Item i2) {
            int index1 = ids.indexOf(i1.getId());
            int index2 = ids.indexOf(i2.getId());
            return Integer.valueOf(index1).compareTo(Integer.valueOf(index2));
        }
    });
}
6pp0gazn

6pp0gazn3#

即使是老问题也会在很久以后再次被问到。我用一个Map解决了这个问题:

@Override
public List<MyItem> fetch(List<Long> ids) {
    // Create an identity map using the generic fetch. Rows are returned, but not necessarily in the same order
    Map<Long, MyItem> resultMap = super.fetch(ids).stream().collect(Collectors.toMap(MyItem::getId, Function.identity()));
    // Now return the rows in the same order as the ids, using the map.
    return ids.stream().map(id -> resultMap.get(id)).collect(Collectors.toList());
}
2o7dmzc5

2o7dmzc54#

这种特殊情况可以很容易地使用ORDER BY id DESC来处理,但我猜这只是一个选择不当的示例。
我认为这是不可能的,除非您能找到一种利用SQL来实现这一点的方法。
您应该有一个持久层来将对象从数据库Map到Java(您不应该将ResultSet传递到持久层之外)。

w7t8yxp5

w7t8yxp55#

轻松一点

items.sort(Comparator.comparingLong(i -> ids.indexOf(i.getId())));

相关问题