在第三章介绍了基本的增删改查操作后,接下来来看一下使用Jooq来进行进阶的数据库操作。
代码:
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);
}
代码:
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()));
});
代码:
dslContext.select(POJO.COLUMN).from(YOUR_TABLE).groupBy(POJO.COLUMN).having(CONDITION).fetchInto(POJO.class);
代码:
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()查询出的结果集的数据行数应为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]