查询_fetchOptional
dao的父类
import com.google.common.base.Preconditions;
import com.qbsea.mysboot2common.api.model.PageQuery;
import org.jooq.Attachable;
import org.jooq.DSLContext;
import org.jooq.Field;
import org.jooq.Record;
import org.jooq.SelectQuery;
import org.jooq.Table;
import org.jooq.UpdatableRecord;
import org.jooq.impl.DSL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import java.util.Optional;
/**
* Created by LiuQi on 18/1/3.
*/
public abstract class JooqDaoSupport {
private DSLContext create;
protected DSLContext getCreate() {
return create;
}
@Autowired
protected void setCreate(DSLContext create) {
this.create = create;
}
public <A extends Attachable> A attach(A attachable) {
Preconditions.checkArgument(attachable != null, "attachable can not be null");
attachable.attach(create.configuration());
return attachable;
}
public <R extends UpdatableRecord<R>> R insert(R record, Field<?>... fields) {
record = attach(record);
if (fields == null || fields.length == 0) {
record.insert();
} else {
record.insert(fields);
}
return record;
}
public <R extends UpdatableRecord<R>> R update(R record, Field<?>... fields) {
record = attach(record);
if (fields == null || fields.length == 0) {
record.update();
} else {
record.update(fields);
}
return record;
}
public <R extends UpdatableRecord<R>> R insertOrUpdate(R record, Field<?>... fields) {
record = attach(record);
try {
insert(record, fields);
} catch (DuplicateKeyException e) {
update(record, fields);
}
return record;
}
protected SelectQuery<?> pagination(SelectQuery<?> selectQuery, PageQuery<?> pageQuery) {
if (pageQuery.getSortField() != null) {
Field<Object> field = DSL.field(pageQuery.getSortField());
if (pageQuery.isDesc()) {
selectQuery.addOrderBy(field.desc());
} else {
selectQuery.addOrderBy(field.asc());
}
}
selectQuery.addLimit(pageQuery.getOffset(), pageQuery.getValidPageSize());
return selectQuery;
}
public <R extends Record> Optional<R> findById(Table<R> table, long id) {
return getCreate().fetchOptional(table, DSL.field("id").eq(id));
}
}
分页相关类
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import org.jooq.Condition;
import org.jooq.impl.DSL;
import java.io.Serializable;
/**
* @author LiuQi
*/
@Data
public class PageQuery<Q extends PageQuery.JooqConditionBuilder> implements Serializable {
public static final int DEFAULT_PAGE_SIZE = 10;
/**
* 分页大小
*/
private int pageSize;
/**
* 页数
*/
private int pageNo;
/**
* 排序字段名
*/
private String sortField;
/**
* 是否倒序,默认正序
*/
private boolean desc;
/**
* 查询条件
*/
private Q query;
@JsonIgnore
public int getValidPageNo() {
return pageNo <= 0 ? 1 : pageNo;
}
@JsonIgnore
public int getValidPageSize() {
return pageSize <= 0 ? DEFAULT_PAGE_SIZE : pageSize;
}
@JsonIgnore
public int getOffset() {
return (getValidPageNo() - 1) * getValidPageSize();
}
@JsonIgnore
public Condition getJooqCondition() {
return query == null ? DSL.trueCondition() : query.buildJooqCondition();
}
@FunctionalInterface
public interface JooqConditionBuilder extends Serializable {
/**
* 根据查询条件创建jOOQ的{@link Condition}。
*
* @return
*/
Condition buildJooqCondition();
}
}