select <foreach collection="columnNameList" separator="," item="columnName" close=","> ${columnName} </foreach> a."bridge_code" as "system_code" from ${tableName} left join ( select hbmdt.code as "point_code", hbmdt.collect_code as "collect_code", hbmtt.bridge_code as "bridge_code" from "hm_bridge_monitor_device_tbl" hbmdt left join "hm_bridge_monitor_type_tbl" hbmtt on hbmdt.monitor_type = hbmtt.monitor_type ) as "a" on ${tableName}.point_code = a."point_code" or ${tableName}.collect_code = a.collect_code order by time desc limit 3000 offset 0 将这段mybatissql转换城jooq写法
时间: 2024-02-10 17:11:33 浏览: 124
以下是将该 MyBatis SQL 转换为 JOOQ 写法的代码:
```java
import static org.jooq.impl.DSL.*;
import org.jooq.*;
import org.jooq.impl.*;
public class MyMapper {
public Result<Record> myQuery(DSLContext ctx, String tableName, String[] columnNameList) {
Table<?> a = table(
select(
field(name("hbmdt", "code")).as("point_code"),
field(name("hbmdt", "collect_code")).as("collect_code"),
field(name("hbmtt", "bridge_code")).as("bridge_code")
)
.from(table(name("hm_bridge_monitor_device_tbl")).as("hbmdt"))
.leftJoin(table(name("hm_bridge_monitor_type_tbl")).as("hbmtt"))
.on(field(name("hbmdt", "monitor_type")).eq(field(name("hbmtt", "monitor_type"))))
).as("a");
SelectConditionStep<Record> select = ctx.select(
field(name("a", "bridge_code")).as("system_code")
);
for (String columnName : columnNameList) {
select = select.select(field(name(columnName)));
}
select = select.from(table(name(tableName)))
.leftJoin(a)
.on(field(name(tableName, "point_code")).eq(field(name("a", "point_code")))
.or(field(name(tableName, "collect_code")).eq(field(name("a", "collect_code")))))
.orderBy(field(name("time")).desc())
.limit(3000)
.offset(0);
return select.fetch();
}
}
```
需要注意的是,由于该 SQL 中的列名和表名都是动态的,因此需要将它们作为参数传入方法中。在 JOOQ 中,使用 `name()` 方法将字符串转换为 SQL 名称。由于 `select` 子句中的列名也是动态的,因此需要动态构建 `select` 子句。在 JOOQ 中,可以通过连续调用 `select()` 方法来动态添加列。在 JOIN 子句中,可以使用 `table()` 方法将子查询转换为一个可用的表,然后使用 `as()` 方法为其命名。在 ON 子句中,可以使用 `field()` 方法获取字段,然后使用 `eq()` 方法进行比较。在 ORDER BY 子句中,可以使用 `orderBy()` 方法指定排序列和排序方向。最后,使用 `limit()` 和 `offset()` 方法来指定查询的行数和偏移量,然后使用 `fetch()` 方法执行查询并返回结果。
阅读全文