Slick显式编写join查询时未生成对应显式JOIN SQL语句问题
Slick显式JOIN生成隐式连接SQL的原因
你遇到的是Slick 3.1.x版本内置的SQL优化规则导致的预期行为,具体原因如下:
- Slick的SQL编译器默认开启了
JoinRewriter优化规则,针对无复杂连接逻辑的普通INNER JOIN,会自动将显式JOIN ... ON语法重写为等价的隐式连接写法:也就是将所有表放到FROM子句用逗号分隔,连接条件和过滤条件统一合并到WHERE子句中。 - 两种SQL写法在关系代数层面完全等价,数据库生成的执行计划没有差异,不会影响查询性能。
- 如果你需要强制生成显式JOIN语法,可以在项目的
application.conf配置文件中添加以下配置关闭该优化:
slick.jdbc.ansi.plusJoinRewriter = off
补充说明:该优化规则仅针对INNER JOIN生效,LEFT JOIN、RIGHT JOIN等外连接不会被重写,因为外连接的ON子句条件和WHERE子句条件语义不等价,Slick不会对这类连接做重写转换。
内容的提问来源于stack exchange,提问作者BugSource
相关产品推荐
相关产品推荐

