Я пытаюсь использовать 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 ?
Обновление: я придумал этот вид взлома, чтобы получить параметры, материализованные (не идеально и было бы лучше для лучшего решения). Но все же не смог получить нотацию Schema.Table.:
Взлом следует. Пожалуйста, предложите более чистый способ 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;
}