Usando gt, gte, etc. en la subconsulta WHERE en Squeryl ORM

Recientemente comencé a evaluar Squeryl ORM y se ve muy bien, pero finalmente llegué a una consulta SQL que parece ser problemática para "compilar" con Squeryl.

Me gustaría obtener todos los productos que tengan una cantidad mayor que la cantidad promedio de todos los productos. En SQL, esto se vería como

SELECT * FROM product p WHERE p.quantity > (SELECT AVG(quantity) FROM product)

Ya descubrí que Squeryl admite in(), exists() y notExists() en un parche de wheresubconsulta -cláusula. Pero dado que Squeryl también admite la avg agregación, esperaba que algo como esto fuera posible:

val avgQuantity = from(products)(p => compute(avg(p.quantity)))
val oftenOccuringProducts = from(products)(p => where(p.quantity gt avgQuantity) select(p))

Lamentablemente, esto plantea:

type mismatch; found : org.squeryl.Query[org.squeryl.dsl.Measures[Option[org.squeryl.PrimitiveTypeMode.FloatType]]] 
required: org.squeryl.dsl.NumericalExpression[?]

Por supuesto, puedo hacer eso en 2 consultas (primero, obtener la cantidad promedio, luego usarla en una segunda consulta), pero me pregunto si es posible hacerlo. con una consulta que incluye una subconsulta.

¿Es esto imposible con Squeryl o simplemente me estoy perdiendo algo?

Agradecería cualquier ayuda si esto es posible o no, y si, cómo.

Gracias,

Sebastián

preguntado el 01 de julio de 12 a las 21:07

1 Respuestas

Por la misma discusión la lista de correo, se impulsó una solución a la rama principal de Squeryl y se incluirá en la próxima versión.

Respondido 03 Jul 12, 09:07

¿Podría publicar un breve fragmento de cómo se verá la consulta dada por sebastian_oe? - Malta Schwerhoff

Hola, acabo de probar la solución de la rama maestra del proyecto y funciona como se esperaba: val avgQuantity: org.squeryl.Query[org.squeryl.dsl.Measures[Option[Double]]] = from(products)(p => compute(avg(p.quantity))) que luego puedes usar en val oftenOccuringProducts = from(products)(p => where(p.quantity gt avgQuantity) select(p)). Esto crea la consulta como 1 instrucción SQL, como se esperaba. (Tenga en cuenta que agregué el tipo explícitamente a la primera declaración para que quede más claro). - sebastian_oe

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.