Spring jdbc 不适用于 h2 查询递归

Posted

技术标签:

【中文标题】Spring jdbc 不适用于 h2 查询递归【英文标题】:Spring jdbc not work with h2 query recursion 【发布时间】:2016-03-15 10:57:27 【问题描述】:

有标准表组和 ACL。我与 group 表建立了多对多的连接,以便能够将 group 包含在 group 中。现在当我尝试使用 Spring security 替换查询时使用 H2 数据库和请求类型

@Bean
public JdbcUserDetailsManager userDetailsManager() 
    JdbcUserDetailsManager manager = new JdbcUserDetailsManager();
    manager.setDataSource(dataSource);
    manager.setRolePrefix("GROUP_");
    manager.setEnableGroups(true);
    manager.setEnableAuthorities(false);
    manager.setGroupAuthoritiesByUsernameQuery(
            //h2
            "WITH recursive rec_groups (parent, child, name, authority) AS " +
                    "(SELECT gm.group_id, cast(NULL as bigint), g.group_name, ga.authority " +
                    "FROM wsseddb.group_members as gm, wsseddb.groups g, wsseddb.GROUP_AUTHORITIES as ga " +
                    "WHERE username = ? and g.id = gm.group_id and ga.group_id = gm.group_id " +
                    "UNION ALL " +
                    "SELECT gpc.parent_id, gpc.child_id, g.group_name, ga.authority " +
                    "FROM wsseddb.groups_parent_child as  gpc, rec_groups as rg, wsseddb.GROUPS  as g,  wsseddb.GROUP_AUTHORITIES as ga " +
                    "WHERE child_id = rg.parent and g.id = gpc.parent_id and ga.group_id = gpc.parent_id) " +
                    "SELECT gs.parent, gs.name as group_name, gs.authority FROM rec_groups gs");
    return manager;
`

我不回来列出 GrandedAuthority。当我使用 postgresql 时,一切正常。如何用 h2 解决这个问题?

在 web H2 查询中运行良好,但在 spring jdbc preparentstatement 中返回 0 行

【问题讨论】:

【参考方案1】:

There is a known bug 在 H2 的递归 CTE 实现中。 See also this question。就目前而言(版本 1.4.191),如果您的递归 CTE 包含任何绑定变量,则执行不正确。如果您删除并内联绑定变量,它应该可以工作(当然要小心 SQL 注入)。

请注意,此功能是experimental in H2

【讨论】:

谢谢卢卡斯!我会尝试不同的数据库

以上是关于Spring jdbc 不适用于 h2 查询递归的主要内容,如果未能解决你的问题,请参考以下文章

事务不适用于 Spring 3.1 – H2 – junit 4 – hibernate 3.2

具有多结果子查询的查询不适用于 jdbc

Spring Boot 2 - H2 数据库 - @SpringBootTest - org.h2.jdbc.JdbcSQLException 失败:表已存在

SimpleJdbcCall 不适用于存储的函数

SpringBoot实战之使用JDBC和Spring访问数据库

SpringBoot实战之使用JDBC和Spring访问数据库