首页 > 解决方案 > JOOQ 字段类仅限于记录(无类型)

问题描述

我正在尝试创建一个通用的类型安全方法来按主键从行中获取一些字段,如下所示:

/**
 * Abstract Generic DAO Layer for BaseEntity
 *
 * RB - Record Bean
 * EB - Entity Bean
 * PK - Primary key type
*/
public interface AbstractDao<RB extends TableRecord, EB extends BaseEntity, PK> {

    /**
     * Fetches specified fields by given primary key
     */
    Optional<EB> findById(PK id, TableField<RB, ?>... fields);

}

虽然它工作正常,但问题是我无法在此处提供字段类型作为第二个通用参数:

TableField<RB, ?>... fields

由于已知它仅对自身进行字段处理,因此可能导致堆污染问题

我很乐意将我的签名更改为:

Optional<EB> findById(PK id, Field<RB>... fields);

Field只接受它的类型作为泛型参数,而不是记录类型。

在 JOOQ 代码库中是否有任何绑定到其 Record 类型的 Field 类的子/父?

谢谢。

标签: javajooq

解决方案


在 JOOQ 代码库中是否有任何绑定到其 Record 类型的 Field 类的子/父?

TableField<R extends Record, T>是您要查找的类型。任何其他可以提供参考的类型都将<R>与您遇到的问题完全相同,并且它不会提供任何语义优势TableField

无论如何,只需抑制警告:

@SuppressWarnings("unchecked")
Optional<EB> findById(PK id, TableField<RB, ?>... fields);

毕竟,使用可变参数时的这些堆污染警告真的很烦人,而且更多的是语言的缺陷,而不是你的 API。


推荐阅读