Hibernate run IN(VALUES ...)而不是IN查询

atmip9wb  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(95)

我有大量的实体需要从数据库中加载,我有一个这样的查询

FROM ${entityName} x WHERE x.id IN :ids

上面生成的SQL查询如下所示:... where EntityName.id in (? , ? , ? , ? , ? , ? , ? , ? , ...)对于大型ids集来说,这是非常慢的。这里有多篇文章建议运行像这样的IN VALUES查询:

... where EntityName.id in (VALUES (?) , (?) , (?) , (?) , (?) , (?) , (?) , (?) , ...)

以下是我的Java:

List<T> result = entityManager.createQuery(queryString, queryEntity)
    .setParameter("ids", batch)
    .getResultList()

想知道我怎么才能让 hibernate 做到这一点?我需要在HQL中以某种方式指定它吗?我试过了,没想到会成功,但没有。SELECT x FROM ${entityName} x WHERE x.id IN (VALUES :ids)
这在HQL中是可能的吗?或者我需要写一个本地查询吗?

cyej8jka

cyej8jka1#

我的意思是,看,原则上你可以非常容易地做到这一点,只需将一个原生SQL查询传递给createNativeQuery()
但你真的需要问问自己:
我到底在这干什么
如果你有如此大量的id,以至于Postgres无法在in predicate 中有效地处理它们,那么将所有状态拉入JVM并具体化实体对象来表示所有这些行是非常不可能的。
如果你绝对必须这样做,请确保使用StatelessSession
但是您是否考虑过使用存储过程或类似的东西呢?

相关问题