【发布时间】:2022-01-13 11:16:06
【问题描述】:
我一直在尝试传递我想要选择的列,但开箱即用它似乎是不可能的。我尝试过类似
@Query("SELECT :columns FROM USERS u WHERE u.LOCALE = :locale AND u.id IN (:ids)")
Flux<Users> retrieveExportData(@Param("columns") String columns,
@Param("locale") String locale,
@Param("ids") String[] ids);
与
private final R2dbcEntityTemplate template;
我尝试创建自己的查询,但这不起作用,因为它必须是 Criteria 类型,而这只会造成不值得的复杂性。
如果我能添加这样的列就好了
criteriaList.add(
Criteria.where("LOCALE").is(locale)
);
Criteria criteria = Criteria.from(criteriaList);
然后像这样执行
Flux<Users> users = this.template.select(User.class)
.matching(Query.query(criteria))
.all();
或者只是像我的第一个示例一样调用存储库。
有没有人能够成功地做到这一点?
----- 更新 1 -----
我试过这样做:
导入 org.springframework.r2dbc.core.DatabaseClient;
DatabaseClient databaseClient = DatabaseClient.create(connectionFactory);
String sql = "SELECT " + columns + " FROM USERS u WHERE u.LOCALE=" + locale + " AND u.id IN (" + ids + ")";
return databaseClient.sql(sql)
.fetch()
.all().cast(User.class);
但是从 Spring 4.3.6.RELEASE 开始,LinkedCaseInsensitiveMap 不再扩展 LinkedHashMap 和 HashMap,只实现了 Map 接口。
这会导致
Cannot cast org.springframework.util.LinkedCaseInsensitiveMap to User at java.base/java.lang.Class.cast
错误。
然后我尝试了答案中建议的 jooq 方法,但它只会产生语法错误。示例
private final DSLContext ctx = DSL.using(connectionFactory);
private final Users users = ctx.newRecord(Users.USERS); <-- USERS not found
@Query("SELECT :columns FROM USERS u WHERE u.LOCALE = :locale AND u.id IN (:ids)")
public Flux<Users> retrieveExportData(
List<Field<?>> columns,
String locale,
String[] ids
) {
return Flux.from(ctx
.select(columns)
.from("USERS")
.where(users.LOCALE.eq(locale)) <--- LOCALE not found
.and(users.ID.in(ids)) <--- ID not found
).map(r -> r.into(Users.class)); <---- into not found
}
图书馆看起来很有希望。我会努力让它发挥作用。
【问题讨论】: