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