slick 3.3.2 no se une al escribir explícitamente una consulta
Estoy tratando de conseguir dos mesas unidas con slick 3.3.2 y jugar 2.7.x, pero me cuesta entender por qué mis códigos no hacen lo que quiero.
Tengo dos mesas: Foo
y Bar
, ambos con String que necesito unirme a una columna de String, vamos a llamarlo fooBar
val innerJoin = for {
(f, b) <- Foo join Bar on (_.fooBar === _.fooBar)
} yield (f, b)
db.run(innerJoin.result)
Los doctores dicen que esta es la manera de hacerlo: http://scala-slick.org/doc/3.3.2/queries.html#applicative-joins
Pero el deslizamiento de la consulta generado al depurar, en realidad no utiliza una unión, simplemente selecciona las propiedades de las dos tablas, así: (simplificado) select * from Foo, Bar where (x2.fooBar = x3.fooBar)
cláusula
¿Qué está pasando aquí?
Pregunta hecha hace 3 años, 5 meses, 0 días - Por devepicenter
3 Respuestas:
-
Slick ha generado una unión allí, pero está en un formulario conocido como "unida implícita" (en SQL).
Es una diferencia de sintaxis, y se puede comprobar con la documentación de su base de datos para ver si el optimizador de la consulta los tratará igual.
Por regla general no me preocuparía por la superficie SQL text Slick genera, a menos que haya problemas de rendimiento que usted pueda identificar profilando el plan de consulta en su base de datos.
Respondida el Dec 16, 2020 a las 11:43 - por markupmaestro
Votos positivos: 0 | Votos negativos: 0 -
El código que proporcionaste parece estar correcto para realizar una unión entre las tablas
Foo
yBar
en Slick. Sin embargo, la consulta generada por Slick puede no mostrar explícitamente la operación de unión en el SQL resultante.Esto es porque Slick utiliza su propia biblioteca de mapeo de datos y consultas para traducir las operaciones de unión de manera eficiente en SQL. En lugar de traducir directamente las operaciones de unión a un SQL tradicional con la cláusula
JOIN
, Slick utiliza su propia lógica interna para manejar las relaciones entre las tablas.Por lo tanto, aunque el SQL resultante no muestre explícitamente una unión con la cláusula
JOIN
, el comportamiento de la consulta generada por Slick seguirá siendo el correcto y realizará la unión de las tablas de la manera esperada.En resumen, no te preocupes si la consulta generada por Slick no muestra explícitamente una unión con la cláusula
JOIN
, ya que Slick maneja internamente la relación entre las tablas de manera correcta. Si el resultado de la consulta es el esperado y obtienes los datos unidos de las dos tablas, entonces el código está funcionando correctamente.Respondida el Dec 17, 2020 a las 11:44 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El problema:
La unión explícita no funciona porque estás usando la sintaxis
===
para comparar columnas de cadena. Esta sintaxis solo funciona para valores numéricos o booleanos.Solución:
Para unir dos columnas de cadena, debes usar el método
==
. Aquí tienes el código corregido:scala val innerJoin = for { (f, b) <- F join Bar on (_.fooBar == b.fooBar) } yield (f, b) db.run(innerJoin.result)
Explicación adicional:
El operador
===
compara valores numéricos o booleanos utilizando la comparación de igualdad estricta. El operador==
compara valores de cadena utilizando la comparación de igualdad de valor.Referencia:
Respondida el Dec 17, 2020 a las 11:49 - por Gemini
Votos positivos: 0 | Votos negativos: 0