O que é uma consulta nomeada?
O Hibernate permite definir instruções de consulta na forma de strings no arquivo de mapeamento. Este método de consulta é chamado de consulta nomeada.
Quais são os benefícios de usar consultas nomeadas?
Como o uso do HQL do Hibernate geralmente requer a escrita de instruções de consulta de string no código Java, o HQL é misturado entre códigos, destruindo a legibilidade do código. Ao usar consultas nomeadas, você pode separar a lógica de negócios e as instruções de consulta, permitindo que você se concentre nas consultas. O código SQL ou HQL está espalhado por todo o aplicativo.
Consultas nomeadas podem ser usadas para processar consultas complexas
Como implementar consulta nomeada?
Apresentando os seguintes métodos:
Método 1: declare a instrução de consulta na tag <class/> no arquivo de configuração
Copie o código do código da seguinte forma:
<mapeamento de hibernação>
<class name="com.test.bean.Student" table="student" catalog="users">
<id name="id" type="inteiro">
<nome da coluna = "id" />
<gerador />
</id>
<nome da propriedade="nome" type="string">
<nome da coluna="nome" comprimento="11" />
</propriedade>
<nome da propriedade="idade" type="inteiro">
<nome da coluna = "idade" />
</propriedade>
<nome da propriedade="sexo" type="string">
<nome da coluna="sexo" comprimento="2" />
</propriedade>
</class>
<!-- Definir instrução de consulta-->
<query name="findStudentByName">
<![CDATA[do Aluno onde nome = :nome]]>
</query>
</hibernate-mapping>
Nota : O que significa <![CDATA[ ]]>?
Indica que é texto simples. Sem isso, os caracteres < > & não podem ser armazenados diretamente em XML e precisam ser escapados. No entanto, com esta tag, esses símbolos podem ser armazenados em documentos XML sem escapar. Isso pode evitar símbolos especiais inesperados que causam erros de análise XML.
Copie o código do código da seguinte forma:
public List<Aluno> query(){
Sessão sessão = HibernateSessionFactory.getSession();
Consulta q = session.getNamedQuery("findStudentByName");
q.setString("nome", "zhangsan");
Lista<Aluno> lista = q.list();
lista de retorno;
}
Método 2 : Você também pode declarar a instrução de consulta na tag <class/> no arquivo de configuração, mas precisa especificá-la ao chamar o código Java (pacote + classe + nome de configuração)
Copie o código do código da seguinte forma:
<mapeamento de hibernação>
<class name="com.test.bean.Student" table="student" catalog="users">
<id name="id" type="inteiro">
<nome da coluna = "id" />
<gerador />
</id>
<nome da propriedade="nome" type="string">
<nome da coluna="nome" comprimento="11" />
</propriedade>
<nome da propriedade="idade" type="inteiro">
<nome da coluna = "idade" />
</propriedade>
<nome da propriedade="sexo" type="string">
<nome da coluna="sexo" comprimento="2" />
</propriedade>
<!-- Definir instrução de consulta-->
<query name="findStudentByName">
<![CDATA[do Aluno onde nome = :nome]]>
</query>
</class>
</hibernate-mapping>
public List<Aluno> query(){
Sessão sessão = HibernateSessionFactory.getSession();
Consulta q = session.getNamedQuery("com.test.bean.Student.findStudentByName");
q.setString("nome", "zhangsan");
List<Aluno> list = q.list();
lista de retorno;
}
Método três : Use consulta sql nativa <sql-query> Neste método, todas as colunas da tabela devem ser escritas, caso contrário, ocorrerá um erro de 'nome de coluna inválido', a menos que você use escalar de retorno para definir o tipo de campo.
Copie o código do código da seguinte forma:
<mapeamento de hibernação>
<class name="com.test.bean.Student" table="student" catalog="users">
<id name="id" type="inteiro">
<nome da coluna = "id" />
<gerador />
</id>
<nome da propriedade="nome" type="string">
<nome da coluna="nome" comprimento="11" />
</propriedade>
<nome da propriedade="idade" type="inteiro">
<nome da coluna = "idade" />
</propriedade>
<nome da propriedade="sexo" type="string">
<nome da coluna="sexo" comprimento="2" />
</propriedade>
</class>
<!-- Definir instrução de consulta-->
<nome da consulta sql="findStudentByName">
<return alias="s">
</return>
<![CDATA[select {s.*} from student s where s.name = :name]]>
</sql-query>
</hibernate-mapping>
Nota : Você também pode usar a tag <return-property/> dentro da tag <return/> para listar todos os campos da tabela. Da mesma forma que o método descrito acima, todas as colunas são consultadas.
Copie o código do código da seguinte forma:
public List<Aluno> query(){
Sessão sessão = HibernateSessionFactory.getSession();
Consulta q = session.getNamedQuery("findStudentByName");
q.setString("nome", "zhangsan");
List<Aluno> list = q.list();
lista de retorno;
}
Método 4 : Use consulta sql nativa <sql-query> Se você usar return-scalar para definir o tipo de campo, poderá consultar alguns campos.
Copie o código do código da seguinte forma:
<mapeamento de hibernação>
<class name="com.test.bean.Student" table="student" catalog="users">
<id name="id" type="inteiro">
<nome da coluna = "id" />
<gerador />
</id>
<nome da propriedade="nome" type="string">
<nome da coluna="nome" comprimento="11" />
</propriedade>
<nome da propriedade="idade" type="inteiro">
<nome da coluna = "idade" />
</propriedade>
<nome da propriedade="sexo" type="string">
<nome da coluna="sexo" comprimento="2" />
</propriedade>
</class>
<!-- Definir instrução de consulta-->
<nome da consulta sql="findStudentByName">
<return-scalar column="name" type="string"/>
<coluna escalar de retorno = "idade" type = "inteiro"/>
<![CDATA[selecione s.name, s.age from student s where s.name = :name]]>
</sql-query>
</hibernate-mapping>
lista pública<Object[]> query(){
Sessão sessão = HibernateSessionFactory.getSession();
Consulta consulta = session.getNamedQuery("findStudentByName");
query.setString("nome", "zhangsan");
Lista<Object[]> lista = query.list();
lista de retorno;
}
ou :
Copie o código do código da seguinte forma:
public List<Aluno> query(){
Sessão sessão = HibernateSessionFactory.getSession();
Consulta q = session.getNamedQuery("findStudentByName").
setResultTransformer(Transformers.aliasToBean(Student.class));
q.setString("nome", "zhangsan");
Lista<Aluno> lista = q.list();
lista de retorno;
}