pageable - Término de sintaxis SQL para ''WHERE(col1, col2)<(val1, val2)''
pagination hibernate criteria (4)
Como dice mi pregunta, me gustaría saber qué denominamos tipos de consultas con ese tipo de condición en la cláusula WHERE
, es decir:
SELECT * FROM mytable
WHERE (col1, col2) < (1, 2);
En otras palabras:
Dame todos los registros donde col1
es menor que ''1'' o si es igual a ''1'', entonces col2
debe ser menor que ''2'' - y ninguno de los valores es NULL.
Realmente me gusta este tipo de sintaxis, pero no sé cuál es la convención de nomenclatura sobre cómo referirse a este tipo de condición. Parece una tupla condicional, pero ese nombre no me da nada de mis búsquedas.
Mi pregunta surge de la necesidad de saber cómo se llama esta sintaxis para investigar cómo escribir esto usando Criteria API con Hibernate y JPA2 y Postgres.
EDITAR
Pude escribir esto usando la API de Criteria usando la llamada a function () de CriteriaBuilder :
//Our left expression (date, id)
Expression leftVal = criteriaBuilder.function("ROW", Tuple.class,
from.get("date").as(java.util.Date.class),
from.get("id").as(Long.class));
//Our right expression ex: (''2015-09-15'', 32450)
ParameterExpression<Date> dateParam = criteriaBuilder.parameter(Date.class);
ParameterExpression<Long> idParam = criteriaBuilder.parameter(Long.class);
Expression rightVal = criteriaBuilder.function("ROW", Tuple.class, dateParam, idParam)
//build the first predicate using ROW expressions
Predicate predicate = criteriaBuilder.greaterThan(leftVal, rightVal);
//more query building happens
...
//construct final query and add parameters to our param expressions
TypedQuery<MyEntity> typedQuery = em.createQuery(criteriaQuery);
typedQuery.setParameter(dateParam, current.getDate());
typedQuery.setParameter(idParam, current.getId());
En este caso, la current
es el registro que recupero como la fila que queremos obtener ANTES o DESPUÉS. En este ejemplo, lo hago después como lo señala la greaterThan
función mayor de greaterThan
.
En Postgres, esta sintaxis se denomina Comparación de constructores de filas .
Uso de constructores de valores de fila (RVC) en predictores de comparación: bastante a largo plazo
Los RVC se suelen ver en las instrucciones INSERT, pero rara vez como parte de las cláusulas WHERE.
Dudo que esta sintaxis tenga un soporte directo en JPA o Hibernate Criteria API, pero siempre hay una solución alternativa para lograr la misma lógica.
WHERE (col1, col2) < (val1, val2)
La sintaxis anterior se denomina Constructora de valores de filas / sintaxis de tuplas / Subconsulta de filas .
De doc
Sintaxis del constructor de valores de fila ANSI SQL, a veces referida a la sintaxis de tupla AS, aunque la base de datos subyacente puede no ser compatible con esa noción. Aquí, generalmente nos referimos a comparaciones de múltiples valores, típicamente asociadas a componentes
Alternativamente, se puede llamar subconsultas de filas
El corto plazo común es solo "valores de fila" . O "Comparación de valores de fila" para la operación que demuestra. Esa característica ha estado en el estándar SQL desde SQL-92 (!). Actualmente, Postgres es el único RDBMS importante que lo admite en todos los aspectos, especialmente también con soporte de índice óptimo.
En particular, la expresión (col1, col2) < (1, 2)
es solo una abreviatura de ROW(col1, col2) < ROW(1, 2)
en Postgres. La expresión ROW(col1, col2)
también se llama constructor de fila , al igual que ARRAY[col1, col2]
es un constructor de matriz .
Aquí hay una presentación de Markus Winand que analiza la característica de la paginación en detalle:
"Paginación hecha de manera PostgreSQL" en use-the-index-luke.com .
La comparación del valor de la fila comienza en la página 20. La matriz de soporte a la que me he referido está en la página 45.
De ninguna manera estoy afiliado a ninguna de las fuentes que cité.