Я пытаюсь использовать 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;
}