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 y Bar 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