jdbcTemplate 查询仅使用 SELECT * 执行

Posted

技术标签:

【中文标题】jdbcTemplate 查询仅使用 SELECT * 执行【英文标题】:jdbcTemplate query only executes with SELECT * 【发布时间】:2021-01-04 21:25:31 【问题描述】:

长期潜伏和学习者,第一次在这里提问。我正在为当地图书馆开展一个项目,从他们的数据库中提取一些数据,以帮助员工提取为顾客搁置的书籍。这里的问题是对数据库的访问是只读的。我无法创建任何临时表或视图。

我们创建了一个长查询来生成所需的数据,我使用了几个 CTE 来精简内容,然后有一些逻辑基于这本书可能所在的位置来显示它应该从哪里选择。总而言之,我们对查询结果感到满意。

当我尝试使用 jdbcTemplate 来实现它时,我似乎找不到让 SELECT * 以外的任何东西工作的方法。

WITH holdCTE1 (holdID, itemID, ...) AS (
SELECT * 
FROM
    table 1, 
    table 2,
    table 3
WHERE
    yada yada

如果我随后执行 SELECT * FROM holdCTE1,这将为我提供结果。

如果我指定列,像这样

WITH holdCTE1 (holdID, itemID, ...) AS (
SELECT t1.holdID, t2.itemID, t3.title 
FROM
    table 1, 
    table 2,
    table 3
WHERE
    yada yada

无论如何,我在第一个表中遇到语法错误。我已经尝试调整我所有的表 JOIN 并使用别名以及我能遇到的几乎所有东西,但它似乎没有帮助。

我们用来帮助​​过滤的一些事情是调用子查询,例如,在 CTE1 中,我们添加了最后一列

'bib hold' AS hold_type

即使使用 SELECT *, 'bib hold AS hold_type,我也会遇到相同的语法错误。错误的实际措辞是:

StatementCallback; bad SQL grammar ... then my query ... nested exception is org.postgresql.util.PSQLException: ERROR: syntax error at or near ... the first thing under the FROM line

该库使用的是 Postgresql 数据库,我在 SQL 端使用带有 jdbcTemplate 的 Spring。

提前感谢您的关注。

【问题讨论】:

【参考方案1】:

很抱歉这个措辞不佳的问题,但我想我今晚偶然发现了一个答案。我正在检查我在 pgAdmin 中记录的所有查询,并复制/粘贴到我的 java 类中。

使用转义字符,代码似乎运行得很好。所以这看起来像是将信息正确传递给查询

WITH hold_bib (hold_id, item_id, birl_bib, patron, status, hold_type) AS (SELECT\n"
        + "    h.id,\n"
        + "    i.record_id,\n"
        + "    birl.bib_record_id,\n"
        + "    h.patron_record_id,\n"
        + "    i.item_status_code,\n"
        + "    'bib'AS hold_type\n"

函数现在开始是这样的:

public List<Hold> libraryNotPicked() 
    String sql = "\n"
        + "WITH hold_bib (hold_id, item_id, birl_bib, patron, status, hold_type) AS (SELECT\n"
        + "    h.id,\n"
        + "    i.record_id,\n"
        + "    birl.bib_record_id,\n"
        + "    h.patron_record_id,\n"
        + "    i.item_status_code,\n"
        + "    'bib'AS hold_type\n"
         ...
        + " ;

List<Hold> holds = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Hold.class));
    return holds;

在我看来,关键是查询中的 \n 类型字符。

【讨论】:

以上是关于jdbcTemplate 查询仅使用 SELECT * 执行的主要内容,如果未能解决你的问题,请参考以下文章

Spring5学习笔记(12) — “JdbcTemplate 操作数据库(查询 select)”

spring jdbcTemplate查询使用

jdbcTemplate方法查询list对象

如何使用 spring 的 jdbcTemplate 在 SQL 查询中指定参数

sqlserver的查询语句和插入更新语句怎么用

如何执行 IN() 和 WHERE=?使用 Spring 的 JDBCTemplate 进行 SQL 查询