如何使用'LIKE'函数选择JOOQ

时间:2017-01-09 22:17:20

标签: java sql postgresql jooq

我现在想在JOOQ中使用'like'函数来选择数据,包括不区分大小写和元素匹配的字符串数据数组。

表架构是:

CREATE TABLE favorites (
    id int,
    items    varchar(100)[]
);

示例数据是:

INSERT INTO favorites (id, items)
    VALUES (1, '{orange, lemon, banana}');
INSERT INTO favorites (id, items)
    VALUES (2, '{apple, grape}');

要获取第一个数据,SQL就像:

SELECT id, items FROM favorites WHERE 'orange' = ANY (items);

我的目标是通过区分大小写和部分匹配来选择数据:例如,使用likeIgnoreCase(“OraNge”)或类似(“%ang%”)?

使用LIKE函数开发以下代码:

Connection connection = ...;
DSLContext context = DSL.using(connection, ...);
List<Table> table = context.select().from(TABLE).fetchInto(Table.class);

我如何使用类似功能?

先谢谢你。

2 个答案:

答案 0 :(得分:0)

PostgreSQL value = ANY (array)运算符无法匹配LIKE谓词之类的值。您需要使用实际的LIKE谓词。在SQL中,你会写:

SELECT id, items
FROM favorites
WHERE EXISTS (SELECT * FROM unnest(items) AS t(item) WHERE item ILIKE '%OraNge%')

或者,使用jOOQ:

context.select(FAVORITES.ID, FAVORITES.ITEMS)
       .from(FAVORITES)
       .whereExists(
            selectFrom(unnest(FAVORITES.ITEMS).as("t", "item")
           .where(field(name("item", String.class)).likeIgnoreCase("%OraNge"))
       )
       .fetch();

jOOQ版本一如既往地假设您有静态导入:

import static org.jooq.impl.DSL.*;

答案 1 :(得分:0)

此外,以下是使用LIKE的几种方法。您始终可以使用jOOQ LIKE谓词,请参阅其文档。在我的第二个例子中,我在字符串中使用sql语法,只是为了证明你可以。您也可以像使用字符串一样使用contains / startsWith / endsWith。

jooq.dsl()
  .select()
  .from(MY_TABLE)
  .where(Employee.EMPLOYEES.LAST_NAME.like("ER")));

jooq.dsl()
  .select()
  .from(EMPLOYEES)
  .where(Employee.EMPLOYEES.LAST_NAME.like("ER"))
  .and("first_name like ?", "ST"));