我正在使用Spring Data Repositories操作PostreSQL数据库中的数据。
在我的一个存储库中,我有一个非常简单的查询:
@Query(value = "FROM MyEntity entity WHERE entity.entityId IN (:entityIds)")
Collection<MyEntity> getEntitiesByIds(@Param("entityIds") Collection<Long> entityIds);
问题是,当我传入一个超过32k~id的集合时,此查询会抛出以下错误:
java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 70324
我做了一些研究,发现这个错误发生是因为postgresql jdbc驱动程序有32k的限制〜你可以传入查询的参数。所以我有两个选择:
批量执行查询。在这一点上,我认为这是我最好的镜头,但我希望找到一个解决方案,这样我就可以在一次数据库调用中拉出我的行。
使用id构建一个临时表,然后将其连接到MyEntity表,但我又遇到了同样的原始问题。对于这种方法,我正在考虑使用所有连接的id传递一个String,然后使用本机查询来提取信息,但它没有按预期工作:
@Query(value = ";WITH cteAllEntityIds(entity_id) AS( " +
"VALUES (?1)) " +
"SELECT p.* FROM my_entity e " +
"JOIN cteAllEntityIds cte ON e.entity_id = cte.entity_id", nativeQuery = true)
Collection<ProfileViewEntity> getProfilesByIds(String profileIds);
当然,我传入的参数是String,而entity_id是数据库中的数字。
你知道如何完成方法#2吗?如何动态构建查询并让jpa以这种方式解释它?
你知道更好的解决方案吗?
欢迎任何建议。
感谢。