Spring Boot+JOOQ(五)进阶查询操作

在第三章介绍了基本的增删改查操作后,接下来来看一下使用Jooq来进行进阶的数据库操作。

count()

代码:

dslContext.selectCount().from(YOUR_TABLE).fetchOne().value1();
dslContext.selectCount().from(YOUR_TABLE).fetchOne().component1();

selectCount()执行count操作,fetchOne()获得查询结果的第一行,value1()或者component1()获取第一列的数值。
value1()和component1()方法都包含在RecordImpl下,并且调用了相同的方法:

public final T1 component1() {
    return this.get(0);
}

public final T1 value1() {
    return this.get(0);
}

groupBy()

代码:

dslContext.select(POJO.COLUMN).from(YOUR_TABLE).groupBy(POJO.COLUMN).fetchInto(POJO.class);

正如sql语法一样,groupBy的字段必须出现在select中,不然编译期间程序会抛出异常。fetchInto()用来指定fetch后的结果以何种类进行映射。
实际上,我们更多情况下会创建一个map来存储每一个分类下的一组数据。因此我们可以直接取出所有我们需要的数据,然后用Java8下的Stream.ForEach(),配合.filter()实现。

Map> map = new HashMap<>();
    List keys= dslContext.select().from(YOUR_TABLE).fetchInto(POJO1.class);
    List values= dslContext.select().from(YOUR_TABLE).fetchInto(POJO2.class);
    values.stream().forEach(v->{
        map.put(v.VALUENAME,keys.stream().filter(k -> CONDITION).collect(Collectors.toList()));
    });

having()

代码:

dslContext.select(POJO.COLUMN).from(YOUR_TABLE).groupBy(POJO.COLUMN).having(CONDITION).fetchInto(POJO.class);

join()

代码:

dslContext.select().from(TABLE1).join(TABLE2).on(CONDITION).fetch();

join()之后得到的实体通常是一个不同于jooq生成的实体的新的实体,可以通过以下方法进行类型的转换。

dslContext.select(TABLE1.id, TABLE1.name, TABLE2.age).from(TABLE1).join(TABLE2).on(CONDITION).fetch().map(r->{
        NewModel nm = new NewModel();
        nm.setId(r.get(0,String.class));
        nm.setName(r.get(1,String.class));
        nm.setAge(r.get(2,Integer.class));
        return nm;
    });
@Data
@AllArgsConstructor
@NoArgsConstructor
public class NewModel {
    private String id;
    private String name;
    private Integer age;
}

我们假设Table1 有两列,id和name,Table2有两列,id和age。select()中指定查询的列,lambda表达式中的set方法要与select中的字段顺序保持一致。

fetchOne() 与 fetchAny()

fetchOne()与fetchAny()都是返回结果集的一行数据,两者的区别在于,fetchOne()查询出的结果集的数据行数应为0行或者1行,并从中返回第一行,0行的情况下放回null。fetchAny()查询出的结果集的数据行数为任意行数,并从中返回第一行。调用fetchOne()方法返回的数据集行数大于一行时,会产生TooManyRowsException。

org.jooq.exception.TooManyRowsException: Cursor returned more than one result
	at org.jooq.impl.Tools.fetchOne(Tools.java:1815) ~[jooq-3.11.10.jar:na]
	at org.jooq.impl.AbstractResultQuery.fetchOne(AbstractResultQuery.java:545) ~[jooq-3.11.10.jar:na]
	at org.jooq.impl.AbstractResultQuery.fetchOneInto(AbstractResultQuery.java:568) ~[jooq-3.11.10.jar:na]
	at org.jooq.impl.SelectImpl.fetchOneInto(SelectImpl.java:2899) ~[jooq-3.11.10.jar:na]

你可能感兴趣的:(Java学习)