JOOQ + JPA 实体

Posted

技术标签:

【中文标题】JOOQ + JPA 实体【英文标题】:JOOQ + JPA entities 【发布时间】:2020-12-22 00:33:34 【问题描述】:

我是 JOOQ 库的新手,有一件事让我非常感兴趣。我首先在 JOOQ 上实现了 CRUD 服务,之后我试图避免一些重复的代码。为了达到这个目标,我添加了 JPA 存储库,并且还在 JOOQ 生成的类中添加了@Entity 注释。现在我仍然想在某些情况下使用 JOOQ(使用过滤器和排序和分页查询列表)。但是出了点问题,现在在 JOOQ 发出选择请求后,我可以在我的类的属性中看到空值。

我通过过滤器获得了正确的实体计数,但映射后类的属性为空。该映射是错误的还是我无法在这种情况下同时使用 JOOQ 和 JPA?

我的所有实体的抽象类(正如我所说,为了避免重复代码,我重构了一些代码,现在使用泛型):

@MappedSuperclass
public abstract class AbstractServiceEntity 

private Integer id;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer getId() 
    return id;


public void setId(Integer id) 
    this.id = id;


我的 JPA 类(由 JOOQ 生成):

/**
* This class is generated by jOOQ.
*/
@SuppressWarnings( "all", "unchecked", "rawtypes" )
@Entity
@Table(schema = "ref", name = "account")
public class Account extends AbstractServiceEntity implements Serializable 

   private static final long serialVersionUID = -162537472;

private Integer       id;
private Integer       transitId;
private Integer       partnerId;
private String        currencyCode;
private String        descr;
private Long          inCredit;
private Long          balanceLimit;
private Long          outCredit;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
private Integer       transitPartnerId;

public Account() 

public Account(Account value) 
    this.id = value.id;
    this.transitId = value.transitId;
    this.partnerId = value.partnerId;
    this.currencyCode = value.currencyCode;
    this.descr = value.descr;
    this.inCredit = value.inCredit;
    this.balanceLimit = value.balanceLimit;
    this.outCredit = value.outCredit;
    this.createdAt = value.createdAt;
    this.updatedAt = value.updatedAt;
    this.transitPartnerId = value.transitPartnerId;


public Account(
    Integer       id,
    Integer       transitId,
    Integer       partnerId,
    String        currencyCode,
    String        descr,
    Long          inCredit,
    Long          balanceLimit,
    Long          outCredit,
    LocalDateTime createdAt,
    LocalDateTime updatedAt,
    Integer       transitPartnerId
) 
    this.id = id;
    this.transitId = transitId;
    this.partnerId = partnerId;
    this.currencyCode = currencyCode;
    this.descr = descr;
    this.inCredit = inCredit;
    this.balanceLimit = balanceLimit;
    this.outCredit = outCredit;
    this.createdAt = createdAt;
    this.updatedAt = updatedAt;
    this.transitPartnerId = transitPartnerId;

还有我从数据库中提取实体的方法:

@Repository
@RequiredArgsConstructor
public class JooqAccountRepository 

private final DSLContext jooq;

public List<Account> findAll(Condition filterCondition, SortField[] sortFields, Integer partnerId, Integer limit, Integer offset) 
    return jooq.selectFrom(ACCOUNT)
            .where(ACCOUNT.PARTNER_ID.equal(partnerId))
            .and(filterCondition)
            .orderBy(sortFields)
            .limit(limit)
            .offset(offset)
            .fetchInto(Account.class);


public Integer findAccountsCount(Integer partnerId) 
    return jooq.selectCount().from(ACCOUNT)
            .where(ACCOUNT.PARTNER_ID.equal(partnerId))
            .fetchOne(0, Integer.class);

【问题讨论】:

您不应该混合使用 JOOQ 和 Spring Data。如果您添加 Spring Data 以使用分页,则您正在混合使用两种工具。您应该通过 JOOQ 使用分页或通过 Spring Data 使用分页(您可以检查 Specification 对象、Pageable 等)。 @FedericoPiazza ye,我以前使用过 Jpa 的规范和 Pageable。但现在我正试图找出问题所在:) 【参考方案1】:

作为我搜索的结果 - 我在 Account 类中的注释上犯了一个错误。如果你想一起使用这些框架,你应该在实体的属性上使用@Column,或者以不同的方式设置你的 jooq 的 codegen 插件) This resource was usefull for me

【讨论】:

您可能遇到了这个问题:github.com/jOOQ/jOOQ/issues/4586。至少在 jOOQ 3.13 之前,JPA @Column 注释对于 jOOQ 的实体是强制性的,即使它不在 JPA 中。显然是一个错误。 @LukasEder 谢谢你的回答!我现在明白了!

以上是关于JOOQ + JPA 实体的主要内容,如果未能解决你的问题,请参考以下文章

加入 jOOQ 时无法获取我的 SpeakerRecord 实体

带有 Gradle 和 Kotlin 的 JOOQ 不生成文件

使用 @Type(type = "jsonb") 注释的实体会从 jooq 代码生成器中丢弃

JOOQ 强制类型无法通过 JPADatabase 代码生成生成 NUMERIC SQL 数据类型

IDEA生成JPA实体类

JPA 一个实体中的两个惰性集合 - 如何运行 JPA 查询以获取实体和只有一个集合