【发布时间】:2016-01-04 01:48:33
【问题描述】:
正如我的问题所述,我想知道在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 函数调用的说明进行操作。
【问题讨论】:
-
我冒昧地调整了表达式的定义。原来的 "Give me all records where either
col1is less than '1' or if not, where col2 is less than '2'" 不会精确地捕获它。
标签: sql hibernate postgresql pagination criteria