Olha, quando preciso fazer SQL longos em Java faço desse jeito.
1 - Crio um arquivo txt com o SQL desejado.
SELECT coluna_1,
coluna_2,
coluna_3
FROM tabela
WHERE coluna_1 = ?
AND coluna_2 = ?
AND coluna_3 = ?
ORDER BY coluna_1 DESC,
coluna_2 ASC
2 - Crio uma constante na classe que usará esse SQL
public static final String SQL_CONSULTA_TABELA_POR_COLUNA1_2_3;
3 - Inicializo a constante
static {
SQL_CONSULTA_TABELA_POR_COLUNA1_2_3 = ResourceUtil.getResourceAsString("sqls/SQL_CONSULTA_TABELA_POR_COLUNA1_2_3.sql");
}
3.1 -Exemplo da classe que lê os SQLs.
public abstract class ResourceUtil {
public String getResourceAsString(String name) {
InputStream inputStream = ResourceUtil.class.getClassLoader().getResouceAsStream(name);
if(inputStream != null) {
return IOUtils.toString(inputStream); // commons-io, por exemplo
}
return null;
}
}
4 - A partir dai vc pode usar a constante em qualquer código, seja JDBC, Hibernate, JPA, etc.
PreparedStatement pstmt = c.prepareStatement(ClassXYZ.SQL_CONSULTA_TABELA_POR_COLUNA1_2_3);
pstmt.set...
pstmt.executeQuery...
Acho bem simples dessa forma, os SQLs ficam separados, formatados e documentados.