这个说法用jOOQ怎么表达呢?
SELECT version FROM abc ORDER BY string_to_array(version, '.', '')::int[] desc limit 1
我正在为功能和演员组合而苦苦挣扎。
我正在尝试在 jOOQ 中为 Postgres 执行 upsert 风格的语句。我运行的框架负责处理这种特定情况下的并发问题,因此我并不担心这一点。我仅使用 jOOQ 来创建 SQL,实际执行是通过 Spring 的 JdbcTemplate 和 BeanPropertySqlParameterSource 完成的。
我决定采用两步“插入..不存在的地方”/“更新..”过程。
我的SQL是:
insert into mytable (my_id, col1, col2) select :myId,
:firstCol, :secondCol where not exists (select 1
from mytable where my_id = :myId)
Run Code Online (Sandbox Code Playgroud)
我正在使用 Postgres 9.4、jOOQ 3.5。我不知道如何表达 select 中的 jOOQ 参数和 jOOQ 中的“where not办法”子句。
更改编程语言或数据库的建议在我的情况下不可行。
我目前正在尝试使用 JOOQ 基于我现有的 Postgres DB 生成类。在我的 JOOQ .xml 配置中,我省略了任何 inputSchema 标记,以便 JOOQ 生成它找到的所有模式:
<schemata>
<schema>
</schema>
</schemata>
Run Code Online (Sandbox Code Playgroud)
但是,我想从生成的内容中排除信息模式。有没有办法以黑名单方式做到这一点?或者我是否必须为除信息架构之外的所有架构添加输入架构?
我有一个从表中选择人员的查询。
SelectConditionStep<PersonRecord> select = context
.selectFrom(Tables.PERSON)
.where(Tables.PERSON.ISDELETED.eq(false));
if(searchValue != null && searchValue.length() > 0){
select.and(Tables.PERSON.LASTNAME.likeIgnoreCase(String.format("%%%s%%", searchValue)));
}
List<PersonRecord> dbPersons = select
.orderBy(Tables.PERSON.LASTNAME, Tables.PERSON.FIRSTNAME, Tables.PERSON.ID)
.limit(length).offset(start)
.fetch();
Run Code Online (Sandbox Code Playgroud)
这段代码工作得很好。因为我在数据表中显示数据,所以我需要具有可选/动态排序功能。到目前为止我没有找到解决方案。
我一直在寻找一种在 jOOQ 中实现以下查询的方法,但找不到任何东西。
SELECT *
FROM tableName
WHERE 'this is a string' LIKE CONCAT('%', word ,'%')
Run Code Online (Sandbox Code Playgroud)
提前致谢。
我正在尝试使用 jOOQ 执行 .fetchMap(key, value) 但我想通过自定义转换器处理密钥。
文档非常清楚如何使用转换器以及如何使用 .fetchMap() 但我在任何地方都找不到将两者结合起来的方法。
我的 jOOQ 版本 (3.9) 是否缺少此功能?
我无法理解以下内容。我有一个字段和一些值:
Field<T> field = ...;
List<T> values = ...;
Run Code Online (Sandbox Code Playgroud)
现在,我想field = ANY({... the values ....})在WHERE子句中表达过滤器。PostgreSQL 支持该ANY(array of values)运算符。我从https://blog.jooq.org/2017/03/30/sql-in-predicate-with-in-list-or-with-array-which-is-faster/得到这个想法。
我尝试了以下方法来创造条件:
field.equal(PostgresDSL.any(PostgresDSL.array(values)));
Run Code Online (Sandbox Code Playgroud)
上面的方法不起作用。这编译:
field.equal((QuantifiedSelect) PostgresDSL.any(PostgresDSL.array(values)));
Run Code Online (Sandbox Code Playgroud)
第一个问题:为什么需要额外的演员阵容?API 是否应该更改?我不确定泛型错误实际上是在哪一边(我的还是 jOOQ 的)。
但是,进行此更改后,查询本身无法正常工作。它给出了错误:
org.jooq.exception.SQLDialectNotSupportedException: Type class java.util.ArrayList is not supported in dialect DEFAULT
Run Code Online (Sandbox Code Playgroud)
第二个问题:如何声明/创建值数组?上面的调用PostgresDSL.array(...)回落到DSL.array(...),这可能是第二个问题的根源?
对于我的项目,我想使用 jOOQ,但我有 3 个数据库。其中两个是相似的(登台,生产),第三个是应用程序的数据库,具有完全不同的模式。所有数据库版本都相同,MySQl 5.6。不同之处在于所使用的表之间,在一个数据库中我得到了公司的翻译,而在另一个数据库中得到了一些客户等。纯 SQL 是非常不可读的,因为查询非常复杂。我知道这没有意义,但这就是我得到的。
有没有可能的方法为具有不同模式的不同数据库生成代码?
我使用 Maven 来生成代码。
有没有办法将参数传递给模拟函数并在内部使用该参数值。示例(注意 name 作为 param):
Mockito.when(clientRepo.registerNewClient(Mockito.any(String.class) as name ))
.then返回(
dsl上下文
.insertInto(客户端)
.set(CLIENT.CLIENT_NAME,名称)
。执行());
有没有办法做到这一点?
使用以下方式使用 jOOQ 进行更新。
for (Balance balance : balances) {
dslContext.update(BALANCE)
.set(BALANCE.AMOUNT, balance.getAmount())
.where(BALANCE.ID.eq(balance.getId))
.execute();
}
Run Code Online (Sandbox Code Playgroud)
这将遍历所有余额并插入每个余额。我知道这可以使用 UpdatableRecord 来完成。但我想避免从数据库中获取余额。Balance 是包含超过 8 个字段的表,但我只对更新一个字段感兴趣。如果没有 UpdatableRecord,还有其他方法可以做到这一点吗?
jooq ×10
java ×7
postgresql ×3
converters ×1
dictionary ×1
maven ×1
mockito ×1
orm ×1
spring ×1
sql ×1