Объекты JOOQ JPA

#java #spring-boot #spring-data-jpa #jooq

#java #весенняя загрузка #spring-data-jpa #jooq

Вопрос:

Я новичок в библиотеке JOOQ, и у меня есть одна вещь, которая меня очень интересует. Сначала я внедрил CRUD-сервис в JOOQ, а после этого попытался избежать дублирования кода. Для достижения этой цели я добавил репозиторий JPA, а также добавил @Entity аннотацию к моему классу, созданному JOOQ. И теперь я все еще хочу использовать JOOQ для некоторых случаев (запрашивая список с использованием фильтра, сортировки и разбивки на страницы). Но что-то пошло не так, и теперь, после того, как JOOQ выполняет запрос выбора, я вижу нули в атрибутах моего класса.

Я получаю правильное количество объектов по фильтру, но свойства класса равны нулю после сопоставления. Это неправильное отображение или я просто не мог использовать JOOQ и JPA вместе для этого случая?

Мой класс abstact для всех сущностей (как я уже сказал, чтобы избежать дублирования кода, я переработал некоторый код и теперь использую дженерики):

 @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);
}
  

}

Комментарии:

1. Вы не должны смешивать данные JOOQ и Spring. Если вы добавили данные Spring для использования разбивки на страницы, вы смешиваете два инструмента. Вы должны либо использовать разбивку на страницы через JOOQ, либо разбивку на страницы через Spring Data (вы можете проверить объекты спецификации, доступные для просмотра и т.д.).

2. @FedericoPiazza да, я уже работал со спецификациями Jpa и возможностью просмотра страниц. Но прямо сейчас я пытаюсь понять, что происходит не так 🙂

Ответ №1:

В результате моих поисков — я допустил ошибку с аннотациями в классе Account. Если вы хотите использовать эти фреймворки вместе, вам следует использовать @Column в свойствах объекта или настроить плагин codegen вашего jooq по-другому) Этот ресурс был полезен для меня

Комментарии:

1. Вероятно, вы столкнулись с этой проблемой: github.com/jOOQ/jOOQ/issues/4586 . По крайней мере, до jOOQ 3.13, аннотация JPA @Column является обязательной для объектов для jOOQ, даже если ее нет в JPA. Явно ошибка.

2. @LukasEder спасибо за ваш ответ! Теперь я понял!