Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres Spring数据JPA通行证列表作为值_Sql_Postgresql_Hibernate_Spring Data Jpa_Spring Data - Fatal编程技术网

Sql Postgres Spring数据JPA通行证列表作为值

Sql Postgres Spring数据JPA通行证列表作为值,sql,postgresql,hibernate,spring-data-jpa,spring-data,Sql,Postgresql,Hibernate,Spring Data Jpa,Spring Data,我有一个表,其中的name列对我很重要 在选项卡名称值“a”中插入; 在选项卡名称值“b”中插入; 在选项卡名称值“c”中插入; 在选项卡名称值“d”中插入; 从Hibernate 5支持的Spring数据存储库中,我希望传递一个名称列表,并从传入的名称返回表中不存在的名称。因此,对于列表“a”、“b”、“c”、“baz”,它应该返回一个值为baz的行 如果手工编写,以下查询将适用于此场景 listname的值为“a”、“b”、“c”、“baz” 选择名称 来自列表 除了 选择名称 从选项卡 在

我有一个表,其中的name列对我很重要

在选项卡名称值“a”中插入; 在选项卡名称值“b”中插入; 在选项卡名称值“c”中插入; 在选项卡名称值“d”中插入; 从Hibernate 5支持的Spring数据存储库中,我希望传递一个名称列表,并从传入的名称返回表中不存在的名称。因此,对于列表“a”、“b”、“c”、“baz”,它应该返回一个值为baz的行

如果手工编写,以下查询将适用于此场景

listname的值为“a”、“b”、“c”、“baz” 选择名称 来自列表 除了 选择名称 从选项卡 在“从列表中选择名称”中的“名称”位置 因此,我将以下方法添加到我的JPA假设中

@Queryvalue=带有listname +作为值:名称 +选择名称 +来自列表 +除了 +选择名称 +从选项卡 +其中“从列表中选择名称”中的名称,nativeQuery=true 从给定列表集合名称中列出FindNamesMissing; 然而,Spring数据传入名称集合的方式是将“a”、“b”、“c”、“baz”替换为“a”、“b”、“c”、“baz”。所以集合对于IN子句非常有用,但在这种情况下就不行了。本质上,我需要传入列表并将它们放入一个伪表中,就像值所做的那样

我不希望手工构建任何查询,也不希望使用SQL注入。是否有方法修改此查询以接受来自JPA的集合?

不幸的是,名称不会生成您需要的值、、,而是具有值?、?、?、?,?,?,?。您需要一个返回所需类型集的函数。要获取数据库版本的列表,可以使用以下查询:

SELECT 
  p.proname as "Name",
  pg_catalog.pg_get_function_result(p.oid) as "Result data type",
  pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types"
FROM pg_catalog.pg_proc p
WHERE pg_catalog.pg_get_function_result(p.oid) LIKE 'SETOF %';
由于您寻求的是文本类型,至少在postgres 9.5中可行的功能是:

unnestanyarray返回任意元素集 regexp_split_to_table目标文本、模式文本、标志文本返回文本集 json\u对象\u键json返回文本集 json_object_keysjsonb返回文本集 第一个选项需要支持将数组作为参数传递。您可以通过将库添加到项目中,或将字符串编译到中,并使用类型转换,从而进行子查询:

WITH list(name) AS (select unnest(cast('{a,b,c,baz}' as text array)))
避免使用::text[]语法进行类型转换,因为Hibernate会将其作为输入参数进行解析,并将其替换为问号。有些人尝试使用数组构造函数,比如array[:values],但只有当您直接在查询中键入每个值,而不是通过JDBC绑定它们时,这种方法才有效

第二个要求首先将参数编译成一个字符串,其中包含一个不存在于任何参数中的分隔符,然后将该分隔符用作正则表达式,第三个参数必须是“g”,以确保它拆分所有参数,而不是第一个匹配项。虽然这很困难而且容易出错,但不需要额外的库就可以完成

第三个选项是编译一个json对象,其中的值是键,您可能还需要一个额外的库来支持json参数。我已经出版了其中两本,但这是一个大的解决办法,可以通过更简单的方式实现

最后,无论您选择哪一个,查询中的where条件也是向后的。最后的结果是,假设您使用了“数组作为字符串”选项,并且没有外部库在本地测试时看起来像这样:

WITH list(name) AS (select unnest(cast('{a,b,c,baz}' as text array)))
SELECT name
FROM list WHERE name NOT IN (SELECT name FROM tab);
 name 
------
 baz
(1 row)