Hibernate - linguagem de consulta
Hibernate Query Language (HQL) é uma linguagem de consulta orientada a objetos, semelhante ao SQL, mas em vez de operar em tabelas e colunas, HQL trabalha com objetos persistentes e suas propriedades. As consultas HQL são traduzidas pelo Hibernate em consultas SQL convencionais, que por sua vez executam ações no banco de dados.
Embora você possa usar instruções SQL diretamente com o Hibernate usando SQL nativo, eu recomendaria usar HQL sempre que possível para evitar aborrecimentos de portabilidade de banco de dados e tirar proveito da geração de SQL do Hibernate e estratégias de cache.
Palavras-chave como SELECT, FROM e WHERE, etc., não diferenciam maiúsculas de minúsculas, mas propriedades como nomes de tabela e coluna diferenciam maiúsculas de minúsculas em HQL.
Cláusula FROM
Você vai usar FROMcláusula se você deseja carregar objetos persistentes completos na memória. A seguir está a sintaxe simples de usar a cláusula FROM -
String hql = "FROM Employee";
Query query = session.createQuery(hql);
List results = query.list();
Se você precisar qualificar totalmente um nome de classe em HQL, basta especificar o pacote e o nome da classe da seguinte forma -
String hql = "FROM com.hibernatebook.criteria.Employee";
Query query = session.createQuery(hql);
List results = query.list();
Cláusula AS
o AScláusula pode ser usada para atribuir aliases às classes em suas consultas HQL, especialmente quando você tem as consultas longas. Por exemplo, nosso exemplo simples anterior seria o seguinte -
String hql = "FROM Employee AS E";
Query query = session.createQuery(hql);
List results = query.list();
o AS palavra-chave é opcional e você também pode especificar o alias diretamente após o nome da classe, como segue -
String hql = "FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
Cláusula SELECT
o SELECTA cláusula fornece mais controle sobre o conjunto de resultados do que a cláusula from. Se você deseja obter algumas propriedades de objetos em vez do objeto completo, use a cláusula SELECT. A seguir está a sintaxe simples de usar a cláusula SELECT para obter apenas o campo first_name do objeto Employee -
String hql = "SELECT E.firstName FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
É notável aqui que Employee.firstName é uma propriedade do objeto Employee em vez de um campo da tabela EMPLOYEE.
Cláusula WHERE
Se você deseja restringir os objetos específicos que são retornados do armazenamento, use a cláusula WHERE. A seguir está a sintaxe simples de usar a cláusula WHERE -
String hql = "FROM Employee E WHERE E.id = 10";
Query query = session.createQuery(hql);
List results = query.list();
Cláusula ORDER BY
Para classificar os resultados da consulta HQL, você precisará usar o ORDER BYcláusula. Você pode ordenar os resultados por qualquer propriedade nos objetos no conjunto de resultados ascendente (ASC) ou descendente (DESC). A seguir está a sintaxe simples de usar a cláusula ORDER BY -
String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
Query query = session.createQuery(hql);
List results = query.list();
Se você quiser classificar por mais de uma propriedade, basta adicionar as propriedades adicionais ao final da ordem por cláusula, separadas por vírgulas da seguinte forma -
String hql = "FROM Employee E WHERE E.id > 10 " +
"ORDER BY E.firstName DESC, E.salary DESC ";
Query query = session.createQuery(hql);
List results = query.list();
Cláusula GROUP BY
Esta cláusula permite que o Hibernate extraia informações do banco de dados e agrupe-as com base no valor de um atributo e, normalmente, use o resultado para incluir um valor agregado. A seguir está a sintaxe simples de usar a cláusula GROUP BY -
String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +
"GROUP BY E.firstName";
Query query = session.createQuery(hql);
List results = query.list();
Usando parâmetros nomeados
O Hibernate suporta parâmetros nomeados em suas consultas HQL. Isso torna a escrita de consultas HQL que aceitam entrada do usuário fácil e você não precisa se defender contra ataques de injeção de SQL. A seguir está a sintaxe simples de usar parâmetros nomeados -
String hql = "FROM Employee E WHERE E.id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id",10);
List results = query.list();
Cláusula UPDATE
Atualizações em massa são novas no HQL com Hibernate 3, e o trabalho de exclusão é diferente no Hibernate 3 do que no Hibernate 2. A interface Query agora contém um método chamado executeUpdate () para executar instruções HQL UPDATE ou DELETE.
o UPDATEcláusula pode ser usada para atualizar uma ou mais propriedades de um ou mais objetos. A seguir está a sintaxe simples de usar a cláusula UPDATE -
String hql = "UPDATE Employee set salary = :salary " +
"WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("salary", 1000);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
Cláusula DELETE
o DELETEcláusula pode ser usada para excluir um ou mais objetos. A seguir está a sintaxe simples de usar a cláusula DELETE -
String hql = "DELETE FROM Employee " +
"WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
Cláusula INSERT
Suporta HQL INSERT INTOcláusula apenas onde os registros podem ser inseridos de um objeto para outro objeto. A seguir está a sintaxe simples de usar a cláusula INSERT INTO -
String hql = "INSERT INTO Employee(firstName, lastName, salary)" +
"SELECT firstName, lastName, salary FROM old_employee";
Query query = session.createQuery(hql);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
Métodos Agregados
O HQL oferece suporte a uma variedade de métodos agregados, semelhantes ao SQL. Eles funcionam da mesma maneira em HQL e em SQL e a seguir está a lista das funções disponíveis -
Sr. Não. | Funções e descrição |
---|---|
1 | avg(property name) A média do valor de uma propriedade |
2 | count(property name or *) O número de vezes que uma propriedade ocorre nos resultados |
3 | max(property name) O valor máximo dos valores da propriedade |
4 | min(property name) O valor mínimo dos valores da propriedade |
5 | sum(property name) A soma total dos valores da propriedade |
o distinctpalavra-chave conta apenas os valores únicos no conjunto de linhas. A consulta a seguir retornará apenas uma contagem única -
String hql = "SELECT count(distinct E.firstName) FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
Paginação usando consulta
Existem dois métodos da interface Query para paginação.
Sr. Não. | Método e Descrição |
---|---|
1 | Query setFirstResult(int startPosition) Este método usa um número inteiro que representa a primeira linha em seu conjunto de resultados, começando com a linha 0. |
2 | Query setMaxResults(int maxResult) Este método diz ao Hibernate para recuperar um número fixo maxResults de objetos. |
Usando os dois métodos acima juntos, podemos construir um componente de paginação em nosso aplicativo da web ou Swing. A seguir está o exemplo, que você pode estender para buscar 10 linhas por vez -
String hql = "FROM Employee";
Query query = session.createQuery(hql);
query.setFirstResult(1);
query.setMaxResults(10);
List results = query.list();