Java JDBC中的Concat SQL [关闭]

Posted

技术标签:

【中文标题】Java JDBC中的Concat SQL [关闭]【英文标题】:Concat SQL in Java JDBC [closed] 【发布时间】:2021-06-30 08:52:10 【问题描述】:

我想创建一个表,显示来自 mysql 的两个字段的连接,并将其放入 java 中的一个(表)字段中。

 pst = connection.prepareStatement("select patientId,concat(pFirstname,' ', pLastname), pAge, pAddress from infopatient");

这是我收到的错误,但我的数据库中有 pFirstname 和 pLastname。

java.sql.SQLException: 列 'concat(pFirstname,' ',pLastname)' 未找到。

【问题讨论】:

为这个表达式添加别名。 只是一个猜测:你可能需要给它一个名字:CONCAT(...) AS some_name 请发布minimal reproducible example 和完整的异常堆栈跟踪 【参考方案1】:

这里有两个选择。首先,您可以使用序数访问您的结果集,例如:

pst = connection.prepareStatement("SELECT patientId, CONCAT(pFirstname, ' ', pLastname), pAge, pAddress FROM infopatient");
ResultSet rs = pst.executeQuery();
while (rs.next()) 
    String fullName = rs.getString(2);  // access second column of your select

另一个选项,正如 cmets 中所暗示的那样,就是给连接的字段一个别名,例如

String sql = "SELECT patientId, CONCAT(pFirstname, ' ', pLastname) AS fullName, pAge, pAddress FROM infopatient"
pst = connection.prepareStatement(sql);
ResultSet rs = pst.executeQuery();
while (rs.next()) 
    String fullName = rs.getString("fullName");  // access via alias

我通常更喜欢第二个选项,因为它更直观、更易读,而且如果选择的顺序发生变化(而第一个版本没有变化),它也很健壮。

【讨论】:

第一个选项不安全。如果没有指定别名,则表达式文本被用作别名,这可能会导致代码中不可预测的时刻出现问题(有时可能很难定位),这可能看起来绝对不相关。 @Akina 不,在第一种情况下,选择列表的顺序不应该取决于是否有别名。正如我所指出的,选项 #2 更可取,因为如果有人重构选项 #1 中的选择,它可能会无意中破坏代码。 在第一种情况下,选择列表的顺序不应该取决于是否有别名。我对此一无所知。我的意思是,如果没有别名,列名包含对象名称中不合法的符号,这可能会导致问题。 OP 遇到的问题会立即发生并且很明显 - 但在另一种情况下,它可能会发生在一些异国情调的地方。 哦...我没有想到这一点,好点。使用别名版本的另一个原因。

以上是关于Java JDBC中的Concat SQL [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException: SQL 语句在 org.hsqldb.jdbc.JDBCUtil.sqlException 处关闭

Java中的JDBC_part1

JDBC存在的问题

SQL语法错误-CONCAT,控制台-BigQuery [关闭]

java mybatis学习之$和#区别,mapper代理接口,动态SQL,在日志中输出mybatis的sql语句

纯 JDBC / Java 中的 DAO 教程 [关闭]