#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 спасибо за ваш ответ! Теперь я понял!