jdbcTemplate查询仅使用SELECT *执行

问题描述

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

我们创建了一个较长的查询来生成所需的数据,我使用了几个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,...) AS (
SELECT t1.holdID,t2.itemID,t3.title 
FROM
    table 1,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。

感谢您的光临。

解决方法

很抱歉这个措辞不好的问题,但是我想我今天晚上偶然发现了一个答案。我正在检查在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,\n"
        + "    'bib'AS hold_type\n"
         ...
        + " ;

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...