问题描述
长期潜伏者和学习者,这里是第一次问题。我正在为一个本地图书馆设计一个项目,以便从他们的数据库中提取一些数据,以帮助员工提取保留给顾客的书籍。这里的要点是对数据库的访问是只读的。我无法创建任何临时表或视图。
我们创建了一个较长的查询来生成所需的数据,我使用了几个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型字符。