【发布时间】:2014-03-08 11:50:40
【问题描述】:
我正在尝试使用 querydsl 为动态模式构建动态查询。我试图只获取查询,而不必实际执行它。
到目前为止,我遇到了两个问题: - schema.table 符号不存在。相反,我只得到表名。 - 我已经能够得到查询,但它分离出变量并输入“?”相反,这是可以理解的。但我想知道是否有某种方法可以获得包括参数在内的完全物化查询。
这是我目前的尝试和结果(我正在使用 MySQLTemplates 来创建配置):
private SQLTemplates templates = new MySQLTemplates();
private Configuration configuration = new Configuration(templates);
String table = "sometable"
Path<Object> userPath = new PathImpl<Object>(Object.class, table);
StringPath usernamePath = Expressions.stringPath(userPath, "username");
NumberPath<Long> idPath = Expressions.numberPath(Long.class, userPath, "id");
SQLQuery sqlQuery = new SQLQuery(connection, configuration)
.from(userPath).where(idPath.eq(1l)).limit(10);
String query = sqlQuery.getSQL(usernamePath).getSQL();
return query;
我得到的是:
select sometable.username
from sometable
where sometable.id = ?
limit ?
我想得到的是:
select sometable.username
from someschema.sometable
where sometable.id = ?
limit ?
更新:我想出了这种 hack 来实现参数化(不理想,希望有更好的解决方案)但仍然 无法获得 Schema。表格符号起作用:
Hack 紧随其后。请建议更清洁的 QueryDsl 方式:
String query = cleanQuery(sqlQuery.getSQL(usernamePath));
private String cleanQuery(SQLBindings bindings){
String query = bindings.getSQL();
for (Object binding : bindings.getBindings()) {
query = query.replaceFirst("\\?", binding.toString());
}
return query;
}
【问题讨论】:
-
我正在做与您正在做的完全相同的事情 - (1) 使用带有投影的 getSQL(...) 以便不执行查询,以及 (2) 替换“?”以一对一的方式绑定。我个人不知道更好的解决方案。
-
如果 querydsl 可以构建完全物化查询并支持模式前缀,它将是动态查询构建所需的完美工具。我仍然希望这里的图片中可能缺少一些东西。
-
它确实支持模式前缀 - 给我几分钟,我会发布一个答案如何做到这一点。
标签: java sql database querydsl database-agnostic