How to get fully materialized query from querydsl
To enable schema printing use the following pattern
SQLTemplates templates = MySQLTemplates.builder() .printSchema() .build();
SQLTemplates subclasses were used before, but since some time the builder pattern is the official way to customize the templates http://www.querydsl.com/static/querydsl/3.3.1/reference/html/ch02s03.html#d0e904
And to enable direct serialization of literals use
//configuration levelconfiguration.setUseLiterals(true);//query levelconfiguration.setUseLiterals(true);
Here is a full example
// configurationSQLTemplates templates = MySQLTemplates.builder() .printSchema() .build();Configuration configuration = new Configuration(templates);// queryingSQLQuery sqlQuery = new SQLQuery(connection, configuration) .from(userPath).where(idPath.eq(1l)).limit(10);sqlQuery.setUseLiterals(true); String query = sqlQuery.getSQL(usernamePath).getSQL();
If you always just want the SQL query string out, move setUseLiterals from query to configuration.
Concerning the usage of Querydsl expressions the usage of code generation like documented here is advised http://www.querydsl.com/static/querydsl/3.3.1/reference/html/ch02s03.html
It will make your code typesafe, compact and readable.
If you want to try Querydsl without code generation you can replace
Path<Object> userPath = new PathImpl<Object>(Object.class, variable);
with
Path<Object> userPath = new RelationalPathBase<Object>(Object.class, variable, schema, table);
When working with QueryDSL, you must provide a template for the database platform to build the query for. I see you are already are doing this here:
private SQLTemplates templates = new MySQLTemplates();private Configuration configuration = new Configuration(templates);
To make the schema name appear in the generated query, the only way I have found to do this is (there may be an easier way) is to extend the template class and explicitly call this.setPrintSchema(true);
inside the constructor. Here is a class that should work for MySql:
import com.mysema.query.sql.MySQLTemplates;public class NewMySqlTemplates extends MySQLTemplates { public NewMySqlTemplates() { super('\\', false); } public NewMySqlTemplates(boolean quote) { super('\\', quote); } public NewMySqlTemplates(char escape, boolean quote) { super(escape, quote); this.setPrintSchema(true); }}
Then simply use this NewMySqlTemplates
class in place of the MySQLTemplates
class like this:
private SQLTemplates templates = new NewMySQLTemplates();private Configuration configuration = new Configuration(templates);
I have this working using PostgresTemplates, so I may have a typo or mistake in the NewMySqlTemplates class above, but you should be able to get it to work. Good luck!