'WHERE(col1,col2)<的语法术语(val1,val2)'

时间:2015-10-07 00:34:17

标签: sql hibernate postgresql pagination criteria

正如我的问题所述,我想知道在WHERE条款中我们称之为具有该类型条件的查询类型,即:

SELECT * FROM mytable
WHERE (col1, col2) < (1, 2);

换句话说:
向我提供col1小于'1'的所有记录,或者如果它等于'1',则col2必须小于'2' - 并且没有值为NULL

我非常喜欢这种语法,但不知道如何引用这种类型的条件的命名约定。它看起来像元组条件,但该名称并没有从我的搜索中给我任何东西。

我的问题源于需要知道这个语法是什么,以便研究如何使用Criteria API和Hibernate以及JPA2和Postgres来编写它。

修改

我能够使用Criteria API使用CriteriaBuilder's function()调用来编写此代码:

//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());
在这种情况下,

current是我检索的记录,作为我们想要在之前或之后获取记录的行。在这个例子中,我按照greaterThan函数调用的说明进行操作。

3 个答案:

答案 0 :(得分:5)

常见的短期只是&#34;行值&#34; 。或&#34;行值比较&#34; 表示您演示的操作。自SQL-92(!)以来,该功能一直在SQL标准中。 Postgres是目前唯一在各方面都支持它的主要RDBMS - 尤其是最佳索引支持。

特别是,表达式(col1, col2) < (1, 2)只是Postgres中ROW(col1, col2) < ROW(1, 2)的简写。 表达式ROW(col1, col2)也称为row constructor - 就像ARRAY[col1, col2]array constructor一样。

对于更详细,更等效的表达来说,它很方便:

col1 < 1 OR (col1 = 1 AND col2 < 2)

...而且Postgres可以在(col1, col2)(col1 DESC, col2 DESC)上使用索引。

与(!)

明显不同
col1 < 1 AND  AND col2 < 2

考虑示例:(1,1) ...

以下是Markus Winand的演讲,详细讨论了分页功能:

"Pagination done the PostgreSQL way" on use-the-index-luke.com

行值比较从第20页开始。我所指的支持矩阵在第45页。

我与我引用的任何来源无关。

答案 1 :(得分:0)

WHERE (col1, col2) < (val1, val2)

以上语法称为行值构造函数 / 元组语法 / 行子查询

来自doc

  

ANSI SQL 行值构造函数语法,有时称为AS 元组   语法,即使底层数据库可能不支持它   概念。在这里,我们通常指的是多值比较,   通常与组件相关联

或者可以将其称为Row Subqueries

答案 2 :(得分:0)

Expression Lists

在比较谓词中使用行值构造函数(RVC) - 相当长的一段时间

RVC通常出现在INSERT语句中,但很少作为WHERE子句的一部分。

我怀疑这种语法在JPA或Hibernate Criteria API中有直接支持,但总会有一种解决方法来实现相同的逻辑。