MyBatis select 不返回行时的特殊结果
问题:MyBatis select 不返回行时的特殊结果 我的 MyBatis 选择是 // result map that sub-selects a folder <resultMap id="beanWithFolderMap" type="com.example.BeanWithFolder"> <id column .../> <association column="folder_id
·
问题: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);
已为社区贡献19918条内容
所有评论(0)