在 Jooq 中重用 Java 记录时出现问题

问题描述 投票:0回答:1

我在较大查询的上下文中使用多重集。沿着这些思路:

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 属性,则效果很好。

有什么想法吗?

谢谢

java jooq
1个回答
0
投票

这不是 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)
© www.soinside.com 2019 - 2024. All rights reserved.