
intellij 提供快捷操作可直接复制拼接字符串的原始值(不含 java 转义与连接符),还支持将传统字符串拼接升级为 java 15+ 的文本块(text block),大幅提升 sql 可读性与数据库调试效率。
intellij 提供快捷操作可直接复制拼接字符串的原始值(不含 java 转义与连接符),还支持将传统字符串拼接升级为 java 15+ 的文本块(text block),大幅提升 sql 可读性与数据库调试效率。
在使用 Spring Data JPA 编写原生 SQL 查询(@Query(nativeQuery = true))时,为保证 Java 代码格式规范,开发者常将长 SQL 拆分为多行字符串并用 + "
" 拼接。但这种写法导致从 IDE 复制 SQL 到数据库客户端(如 DBeaver、MySQL Workbench)时,需手动清理 +、"、\n 等干扰字符,既低效又易出错。
✅ 推荐解决方案:一键提取纯 SQL 文本
将光标置于 SQL 字符串任意位置(如 @Query(value = " with cte as... 的引号内),按下 Alt+Enter(macOS 为 ⌥+↩),选择 “Copy string concatenation text to the clipboard” —— IntelliJ 会自动解析整个字符串拼接表达式,去除所有 Java 语法符号,仅保留原始 SQL 内容(含真实换行与缩进),直接粘贴即可执行。
? 进阶优化:迁移到文本块(Text Block)
若项目已升级至 Java 15 或更高版本,强烈建议改用三重引号(""")定义的文本块。它天然支持多行、保留空白与换行,且无需转义双引号或换行符,SQL 更接近数据库原生风格,也更易维护:
@Query(value = """
with cte as (
select id, 1 as quantity
from product
where id = :productId
union all
select distinct combo_id as id,
quantity
from combo
where product_id = :productId
),
result as (
select o.product_id, o.quantity * c.quantity as 'quantity'
from order_product o
inner join cte c on o.product_id = c.id
)
select sum(quantity)
from result""", nativeQuery = true)
Object method(@Param("productId") String productId);⚠️ 注意事项:
- 文本块中首行结尾的换行符会被自动忽略,末尾
"""建议独占一行以保持 SQL 结构清晰;- 若 SQL 内含动态参数(如
:productId),文本块完全兼容,无需额外处理;- IntelliJ 默认启用 “Text block can be used” 检查(Settings → Editor → Inspections → Java → Code maturity),可自动提示旧字符串拼接的重构机会。
通过快捷键提取或主动采用文本块,你既能快速获取可执行 SQL,又能提升代码可读性与团队协作效率——告别手动清理,让数据库调试回归专注逻辑本身。

















