【发布时间】:2019-08-05 18:39:33
【问题描述】:
我有这样的spring数据存储界面:
public interface MyEntityRepository extends
JpaRepository<MyEntity, Long> {
@Query(nativeQuery = true, value = "select * from my_func(:myList)")
Page<MyEntity> findBy(
@NonNull @Param("myList") List<String> myList,
@NonNull Pageable pageable);
}
Postgres 的函数我是这样定义的(但如果我做错了我可以改变它):
CREATE OR REPLACE FUNCTION my_func(variadic myList text[])
RETURNS SETOF myEntityTable AS $$
... some logic
select * from myEntityTable t where t.foo in (myList);
当我调用这个存储库方法时,我得到了这个错误:
ERROR: operator does not exist: character varying = text[]
Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Where: PL/pgSQL function f_najdi_autorizaciu_na_spracovanie(text[]) line 28 at RETURN QUERY
你能告诉我我应该在我的 postgres 函数中使用什么类型吗?谢谢你的建议。
编辑: 我不能在存储库方法上使用本机查询并将那里的列表传递给 IN 子句,因为我在 DB 函数中有更多的逻辑、变量等......它必须是 DB 函数。
【问题讨论】:
-
Postgres 中的数组不与任何其他语言的任何其他集合相同。他们... 不同。你能解释一下你想用
my_func完成什么吗?传统 SQL 中可能有更优雅的解决方案。 -
@Makoto 嗨,我编辑了我的问题。在我的函数中,我有一些带有光标的高级逻辑,等等。这个传递的参数我只需要在 IN 子句中 where 条件的最终选择中使用
-
所以我相信这是一个 XY 问题 - 您正在尝试根据 IN 查询查找一组记录,并且有一种比您建议的更简单的方法来执行此操作。我为这个问题找到了一个骗子;我鼓励你仔细阅读它。如果不合适,您可以编辑您的问题以解释原因。
-
看起来列表已成功传递(您在遇到错误之前已将其移至函数的第 28 行)。我猜原因是
WHERE t.foo IN (myList);要检查t.foo是否在您的数组中,请改用t.foo = ANY(myList)。
标签: java postgresql spring-data-jpa spring-data plpgsql