我在较大查询的上下文中使用多重集。沿着这些思路:
multiset(
select(DOCUMENT.ID, DOCUMENT.NAME)
.from(DOCUMENT)
.innerJoin(PROJECT_DOCUMENTS)
.on(PROJECT_DOCUMENTS.DOCUMENT_ID.eq(DOCUMENT.ID))
.where(PROJECT_DOCUMENTS.PROJECT_ID.eq(PROJECT.ID))
).as("documents")
.convertFrom(r -> r.collect(intoSet(mapping(ProjectDocument::new))));
ProjectDocument
是Java记录
public record ProjectDocument(Long id, String name, Long count) {
public ProjectDocument(Long id, String name) {
this(id, name, null);
}
}
正如你所看到的,它有两个构造函数,因为我想在不同的场景中使用它。
然而,当我这样做时,Java 并不高兴:
java: method collect in interface org.jooq.Result<R> cannot be applied to given types;
required: java.util.stream.Collector<? super org.jooq.Record2<java.lang.Long,java.lang.String>,A,X>
found: java.util.stream.Collector<org.jooq.Record3<java.lang.Object,java.lang.Object,java.lang.Object>,capture#1 of ?,java.util.Set<java.lang.Object>>
reason: inference variable R has incompatible bounds
upper bounds: org.jooq.Record,org.jooq.Record3<T1,T2,T3>,R
lower bounds: org.jooq.Record2<java.lang.Long,java.lang.String>
如果我将记录更改为仅具有 id 和 name 属性,则效果很好。
有什么想法吗?
谢谢
这不是 jOOQ 特有的,只是使用重载的记录构造函数,类型推断将不再适用于构造函数引用
ProjectDocument::new
。要解决这个问题,只需使用 lambda 即可:
mapping((id, name) -> new ProjectDocument(id, name))
或者,使用静态工厂方法:
public record ProjectDocument(Long id, String name, Long count) {
public static ProjectDocument create(Long id, String name) {
return new ProjectDocument(id, name, null);
}
}
然后:
mapping(ProjectDocument::create)