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.
- Usando o nome da classe em vez do nome da tabela.
- Usando o nome do campo da classe em vez do nome da coluna da tabela.
- 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 User
está 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 select
quando 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.
GO TO FULL VERSION