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, 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数据库,我使用Spring和jdbcTemplate作为SQL端。

提前感谢您的光临。

很抱歉这个问题措辞拙劣,但我想今天晚上我偶然发现了一个答案。我检查了我在pgAdmin中注意到的所有查询,并将其复制/粘贴到我的java类中。

有了转义符,代码似乎运行得很好。因此,这看起来像是将信息正确地传递给查询

WITH hold_bib (hold_id, item_id, birl_bib, patron, status, hold_type) AS (SELECTn"
+ "    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_typen"

现在开始时的功能是这样的:

public List<Hold> libraryNotPicked() {
String sql = "n"
+ "WITH hold_bib (hold_id, item_id, birl_bib, patron, status, hold_type) AS (SELECTn"
+ "    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_typen"
...
+ " ;
List<Hold> holds = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Hold.class));
return holds;

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

最新更新