我试图制作虚拟表并在需要时将其加入真实表。 我出于兼容性原因使用了slick 3.0。 数据库是MySql。
代码如下所示:
def linkTable(data: Seq[(Int, Int)]): Query[(Rep[Int], Rep[Int]), (Int, Int), Seq] = {
val tableRows: Seq[Query[(ConstColumn[Int], ConstColumn[Int]), (Int, Int), Seq]] = {
data.map { case (groupId, merchantId) =>
Query(groupId, merchantId)
}
}
if (tableRows.isEmpty) {
Query(-1, -1)
} else {
tableRows.reduceLeft(_ union _)
}
}
结果类型:
Query[(Rep[Int], Rep[Int]), (Int, Int), Seq]
正是我能够将虚拟表集成到代码库中所需要的。
函数 linkTable 工作正常,除了它生成嵌套的sql:
(SELECT x7.x8 AS x9,
x7.x10 AS x11
FROM (
SELECT x12.x13 AS x8,
x12.x14 AS x10
FROM (
SELECT x15.x16 AS x13,
x15.x17 AS x14
FROM (
SELECT 1 AS x16,
3 AS x17
FROM DUAL
UNION
SELECT 2 AS x16,
3 AS x17
FROM DUAL) x15
UNION
SELECT 3 AS x13,
3 AS x14
FROM DUAL) x12
UNION
SELECT 4 AS x8,
3 AS x10
FROM DUAL) x7
UNION
SELECT 5 AS x9,
3 AS x11
FROM DUAL) x18
导致以下错误:
java.sql.SQLException: Too high level of nesting for select
我需要的是让这些工会变平:
(SELECT 1 AS x7,
3 AS x8
FROM DUAL
UNION
SELECT 2 AS x7,
3 AS x8
FROM DUAL
UNION
SELECT 3 AS x7,
3 AS x8
FROM DUAL
UNION
SELECT 4 AS x7,
3 AS x8
FROM DUAL
UNION
SELECT 5 AS x7,
3 AS x8
FROM DUAL
) x9
有人知道如何通过光滑的3.0实现它? 从字符串进行查询是有效选项,但结果类型应该是正确的。