1.1 Introdução ao HQL

Anteriormente, você conheceu o Hibernate, e agora vou apresentá-lo ao HQL , também conhecido como Hibernate Query Language . Na verdade, este é o SQL convertido para escrever consultas no Hibernate. Ele tem várias diferenças importantes.

  1. Usando o nome da classe em vez do nome da tabela.
  2. Usando o nome do campo da classe em vez do nome da coluna da tabela.
  3. Uso opcional de select.

Vamos pedir ao Hibernate que nos devolva todos os usuários que ele possui no banco de dados. Veja como seria essa solicitação:

from User

Isso é tudo, para comparação, apresentamos uma consulta semelhante em SQL:

select * from user

Aqui Userestá o nome da classe e useré o nome da tabela.

O código Java completo ficará assim:


public List<User> getAllUsers() {
    try (Session session = sessionFactory.openSession()) {
            return session.createQuery("from User", User.class).list();
    }
}

Caso contrário, o HQL é muito semelhante ao SQL - também possui operadores:

  • WHERE
  • ORDER BY
  • GROUP BY
  • HAVING

1.2 Exemplo de trabalho com HQL

Talvez o exemplo anterior seja um pouco confuso devido aos mesmos nomes de tabela e campo. Vamos criar um exemplo especial onde isso seria mais fácil.

Digamos que temos uma tabela user_data que contém os seguintes campos:

  • id INT
  • nome de usuário VARCHAR(100)
  • user_level INT
  • user_created DATE

Criaremos uma classe Java que mapeará para esta tabela:


@Entity
@Table(name="user_data")
class User {
   @Id
   @GeneratedValue
   public Integer id;
 
   @Column(name="user_name")
   public String name;
 
   @Column(name="user_level")
   public Integer level;
 
   @Column(name="user_created")
   public Date created;
}

Agora vamos escrever alguns exemplos:

HQL SQL
do usuário selecione * de user_data
do usuário onde id=3 selecione * de user_data onde id=3
do usuário onde nível em (10,20,30) selecione * de user_data onde user_level IN (10, 20, 30)
da ordem do usuário por ASC criado selecione * da ordem user_data por user_created asc
do usuário onde o nome como 'teste' selecione * de user_data onde user_name como 'test'

As consultas são muito semelhantes e a leitura de consultas HQL quando você está familiarizado com os nomes de classes e seus campos é tão fácil quanto ler as consultas SQL. Pode ser um pouco mais difícil de escrever, mas, novamente, consultas muito complexas raramente são escritas em HQL.

1.3 Usando selecionar

Em HQL, você pode usar selectquando o tipo de dados do resultado não corresponder ao tipo especificado em from.

Por exemplo, queremos obter os nomes de todos os usuários que estão em nossa tabela user_data , então precisamos escrever a seguinte consulta:

select name from User

Além disso, se houver duplicatas entre os nomes, você poderá usar o operador DISTINCT:

select distinct name from User

Aliases funcionam da mesma forma que no SQL:

select distinct u.name from User u where u.created > '2020-01-01'

Bem, completamente na forma de código Java, esta solicitação ficará assim:

public List<String> getUserNames() {
    try (Session session = sessionFactory.openSession()) {
            String hql = "select distinct u.name from User u where u.created > '2020-01-01'";
            Query<String> query = session.createQuery(hql , String.class);
            return query.list();
    }
}

Observe que a consulta deve retornar uma lista de nomes. Os nomes são do tipo String, portanto, tanto o tipo da função quanto o parâmetro de tipo da classe Query são do tipo String.