有没有办法在 Jooq 中通过示例进行查询?
Posted
技术标签:
【中文标题】有没有办法在 Jooq 中通过示例进行查询?【英文标题】:Is there a way to query by example in Jooq? 【发布时间】:2016-02-13 12:37:16 【问题描述】:我有一个由 Jooq 生成的 PersonPojo
和 PersonRecord
。
现在我想做这样的事情:
Person p = new PersonPojo()
p.setId(10);
create.selectFrom(Tables.PERSON).whereLike(p).fetch();
当前版本(3.7)可以吗?
【问题讨论】:
【参考方案1】:jOOQ 3.8+ 解决方案
Query By Example (QBE) 支持在 jOOQ 3.8 中通过#4735 实现。你可以写:
Person p = new PersonPojo();
p.setId(10);
PersonRecord record = new PersonRecord();
record.from(p); // Reuse pre-existing reflection functionality here.
create.selectFrom(Tables.PERSON).where(DSL.condition(record)).fetch();
更多详情请参考Javadoc:
jOOQ 3.7 或更低的解决方案
在较旧的 jOOQ 版本中,您可以自己实现 QBE:
Person p = new PersonPojo();
p.setId(10);
PersonRecord record = new PersonRecord();
record.from(p); // Reuse pre-existing reflection functionality here.
Condition condition = DSL.trueCondition();
for (Field<?> field : record.fields())
if (record.getValue(field) != null)
condition = condition.and(((Field) field).eq(record.getValue(field)));
create.selectFrom(Tables.PERSON).where(condition).fetch();
或者,使用 Java 8:
create.selectFrom(Tables.PERSON)
.where(Stream.of(record.fields())
.filter(f -> record.getValue(f) != null)
.reduce(
DSL.trueCondition(),
(c, f) -> c.and(((Field) f).eq(record.getValue(f))),
(c1, c2) -> c1.and(c2)
))
.fetch();
【讨论】:
这不是我真正想要的。我在 jooq 中想要这样的东西:***.com/a/2883478/5553845。所以您可以创建任何 Person 对象 - 将其用作过滤器并创建 SQL 并运行它。 @UserX:好的,我不知道 QBE 是一个正式的概念。有趣的。在 jOOQ 中原生地添加对它的支持会很好。我已经更新了答案。 这就是我所期待的。感谢您的回答。我试图构建类似的东西 - 但不知道DSL.trueCondition();
方法。以上是关于有没有办法在 Jooq 中通过示例进行查询?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在本地网络中通过 PHP 进行 scp,具有初学者的程序员技能 [关闭]
有没有办法在 devexpress TreeListControl 中通过拖放重新排列节点时预览元素的位置?
有没有办法使用 AnroidUIAutomator 在 Appium 中通过部分资源 ID 查找 Android 元素?
XCTest:有没有办法在 UI 测试中通过 ID 查找任何类型的视图?