Executar sql através do hibernate

Fala pessoal, tudo certo? eu estava pesquisando sobre como executar sql nativo usando o hibernate, mas não encontrei nada, seria possível? ou só utilizando outra ferramenta? Eu preciso pois tenho arquivos de backup salvos na raiz do meu projeto, e faço uma verificação pra ver se o banco existe ou não, e se não existir ele executaria a query, e até o momento, falta só essa parte de escrever umas simples query sql, segue abaixo o meu código →

public static void main(String[] args) {
		checkBd();
	}
	
	//Método que verifica se o banco existe, caso não exista chama os métodos necessários para criar o banco
	private static void checkBd() {
		try {
			EntityManagerFactory emf = Persistence.createEntityManagerFactory("fca");
			EntityManager em = emf.createEntityManager();
			em.getTransaction().begin();
		} catch (Exception e) {
			System.out.println("Não conectou!");
			getScriptFiles(getScriptFolder());
		}
	}
	
	//Este método lê o diretorio "./db/resources/tables/" e retorna a primeira pasta em ordem crescente
		private static String getScriptFolder() {
			 String bdFolder = "";
			 List<File> scriptFolder = new ArrayList<File>();
		     File path = new File("./db/resources/tables/");
		     String[] list = path.list();
		     for(String folder : list) 
		     {	    	 
		    	 scriptFolder.add(new File("./db/resources/tables/" + folder));
		         String dir = scriptFolder.toString();
		         dir = dir.substring(1, dir.length() - 1);
		     }
		     for (File dir : scriptFolder) {
		    	 bdFolder = dir.getName();
				 break;
	         }
		     return bdFolder;
		}
	
	//Este método pega cada arquivo da pasta com os scripts de criação de tabela
	private static void getScriptFiles(String bdFolder) {
		 String bdCreateFile = "";
		 List<File> createTableScript = new ArrayList<File>();
	     File path = new File("./db/resources/tables/"+bdFolder+"/");
	     String[] list = path.list();
	     for(String scriptFile : list) 
	     {	    	 
	    	 createTableScript.add(new File("./db/resources/tables/" + scriptFile));
	         String file = createTableScript.toString();
	         file = file.substring(1, file.length() - 1);
	     }
	     for (File dir : createTableScript) {
	    	 bdCreateFile = dir.getName();
	    	 readScriptQuery(bdFolder, bdCreateFile);
         }
	}
	
	//Este método retorna o script de criação da tabela contido em cada arquivo 
	private static void readScriptQuery(String folderPath ,String filePath) {
		 Path path = Paths.get("./db/resources/tables/"+folderPath+"/"+filePath);
			try {
				List<String> linesArchive;
				linesArchive = Files.readAllLines(path);
				for (String line : linesArchive) {
					System.out.println(line);
				}
			} catch (IOException e) {
				System.out.println("Ocorreu um erro" + e.getMessage());
			}
		}
	
	private static void executeSql(String scriptSql) {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("fca");
		EntityManager em = emf.createEntityManager();
		em.createNativeQuery(scriptSql).executeUpdate();
	}

Você está fazendo isso no seu método executeSql, na linha onde tem a chamada ao método createNativeQuery do EntityManager.
:man_shrugging:

Mas dessa forma ali não esta funcionando, ele me retorna esse erro Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment], eu consigo ler os arquivos, mas na hora de executar ele me retorna isso

Ali no console mostra o que eu estou recebendo

Mas no código que você postou, você não está chamando o método executeSql em nenhum lugar.

No print screen que você postou não tem nenhum "Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]".

Posta o StackTrace do erro.

Estou chamando no main por enquanto até deixar tudo funcional, mas os métodos são todos “encadeados”. Eu queria que ele criasse uma database quando não existisse, ex: “CREATE DATABASE fca …”, e em seguida todas as tabelas do banco(Eu tenho uma pasta com os arquivos .sql que como mostrei ele esta fazendo a leitura), tudo de forma automática caso ele verifique o banco não existe, porem retorna o erro que tinha mencionado acima

query que queria executar quando não houvesse o banco →

exemplo de query para criar as tabelas →

meu persistence.xml com o banco errado pra forçar o erro →

erro que recebo ao tentar executar →

mesmo com o banco certo e executando um sql simples tenho este erro dai →

Tá, mas o CREATE DATABASE realmente não dá pra fazer com o EntityManager, para isso você vai ter que usar JDBC e não JPA.

Eu estava tentando achar algo que não replicasse muita coisa como a configuração do banco, mas com o jdbc seria possível então? Teria mais alguma dica?

Com JDBC sim.
Você não consegue com o EntityManager pois ele depende da DATABASE já criada.

Tem que rodar os CREATE DATABASE antes de criar o EntityManager.

1 curtida