问题:MyBatis select 不返回行时的特殊结果

我的 MyBatis 选择是

 // result map that sub-selects a folder
 <resultMap id="beanWithFolderMap" type="com.example.BeanWithFolder">
    <id column .../>
    <association column="folder_id" property="folder" javaType="com.example.Folder" select="selectFolder"/>
 </resultMap>


 // folder sub-select
 <select id="selectFolder" resultType="com.example.Folder">
        SELECT

        folder_id
        name,

        FROM folders
        WHERE folder_id=#{folderId}
 </select>

当没有找到匹配 folder_id 的行时,我想返回 Folder 类的特殊实例。

现在 MyBatis 在找不到行时返回 null。我想返回一个设置了 folderId 字段的 Folder 实例——因为我知道我在寻找什么,我至少可以设置这个字段。

怎么做?


就像是

        SELECT

        #{folderId} as folder_id,
        name,

        FROM folders
        WHERE folder_id=#{folderId}

会很棒,但我收到异常“无法确定参数 $1 的数据类型”

解答

功能

如果这个查询经常使用,我会为它创建一个小函数。这可能是最快的:

CREATE OR REPLACE FUNCTION f_foo(_folder_id int)
  RETURNS TABLE (folder_id int, name text) AS
$func$
BEGIN

RETURN QUERY
SELECT f.folder_id, f.name
FROM   folders f
WHERE  f.folder_id = $1;

IF NOT FOUND THEN       -- only if nothing was found
    RETURN QUERY
    VALUES ($1, NULL);  -- columns must match!
END IF;

END
$func$ LANGUAGE plpgsql STABLE;

称呼:

SELECT * FROM f_foo(133)

这就是您在脚本中使用的内容。就像从表中选择一样。

普通 SQL

纯SQL还有其他方法,最好用NOT EXISTS。我想 CTE 会有所帮助:

WITH x AS (
   SELECT folder_id, name
   FROM   folders
   WHERE  folder_id = $1;
   )
SELECT * FROM x
UNION  ALL
SELECT $1, NULL
WHERE  NOT EXISTS (SELECT 1 FROM x);
Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容