Há sintaxe de consulta HQL no hibernato. Mas o que estamos mais familiarizados é contar as declarações SQL. Então, como devemos fazer com que o Hibernate Support SQL? Não precisamos considerar isso, a equipe Hibernate já fez isso.
Não vamos falar bobagens, apenas dê um exemplo.
Selecione * de T_USER USR
O exposto acima é uma declaração SQL, e é um absurdo, que todo mundo sabe. O que devemos fazer se o Hibernate quiser executar esta declaração? Veja o código:
Query Query = session.createsqlQuery ("Selecione * de T_USER USR"); É isso, todos devem saber o que resta e o que está acontecendo em perguntas são normais.
Então o que é devolvido após a consulta?
while (iter.hasnext ()) {object [] objs = (objeto []) iter.Next (); for (int i = 0; i <objs.length; i ++) {System.out.print (objs [i]); } System.out.println (); } Cada resultado retornado é uma matriz de objeto [].
Nesse momento, alguém saiu e disse que era orientado a objetos. Sim, é orientado a objetos, infelizmente, não há como.
Vamos continuar assistindo:
Selecione {usr.*} de T_USER USR Vendo isso, acho que os sapatos de algumas crianças estão começando a se mover. Qual é o aparelho?
Não se preocupe, leve seu tempo. Vamos continuar lendo o código primeiro.
A cópia do código é a seguinte:
Query Query = session.createsqlQuery ("Selecione {usr.
AddentitySqlQuery Addentity (String TableAlias, Class EntityType) Declare um entityparameter "raiz": TableAlias - o AliasentityType da tabela SQL - o tipo Java da entidade a ser adicionado como raiz
É o mesmo que é, é uma leve sucção. Você só pode usá -lo.
O primeiro parâmetro refere -se ao alias da tabela. Assim como a declaração acima, o alias da nossa tabela é USR, então o primeiro parâmetro é USR e o segundo se refere a qual classe os resultados da consulta precisam ser mapeados. Aqui, como mapeamos para a tabela T_USER através do Divro no arquivo de mapeamento, somos obviamente o Divante aqui. Depois de verificar, existem declarações SQL, e o resultado é do tipo Dividor.
Os resultados que encontramos são:
org.hibernate.tutorial.domain6.tuser@198cb3d
Claro, o seu deve ser diferente do meu. Não mova o frango.
Talvez não precisemos descobrir tudo, neste momento, tudo o que precisamos é definir o alias:
Selecione U.Id como {usr.id}, ONU como {usr.name}, u.age como {usr.age} de t_user u Vemos que usamos para especificar o alias do campo, e o mesmo é verdadeiro no programa:
A cópia do código é a seguinte:
Query Query = session.createsqlQuery ("Selecione U.Id como {usr.id}, ONU como {usr.name}, u.age como {usr.age} de t_user u"). Addentity ("usr", tuser.class);
<SQL-QUERY name = "Querytuser"> <return alias = "usr" entity-name = "org.hibernate.tutorial.domain6.tuser" /> selecione {usr. Observe que o nome da entidade aqui precisa ser escrito com o nome completo do pacote, caso contrário, um erro será relatado. Aqui temos o retorno da legenda, que especifica o alias e o nome da classe da tabela, para que não precisemos addentidade no tempo de execução.
Veja o código:
Query Query = session.getNamedQuery ("QuerytUser"); query.setParameter ("Nome", "Shun"); Lista da lista = query.list (); Iterator iter = list.iterator ();
Estamos bem assim. Observe que não adicionamos addentidade, principalmente devido à configuração no arquivo de configuração.
Observe que, se configurado no arquivo de configuração, você deve ter a subtago de retorno para especificar o alias da tabela e o nome da classe. Isso evita principalmente julgamentos repetidos ao ler declarações.
Depois de conversar sobre isso há tanto tempo, conversamos sobre mesas com pseudônimo. Então, o que devemos fazer se nossa tabela não tiver pseudônimo, mas queremos encapsular o resultado no objeto?
Selecione * de T_USER USR
É muito simples. Basta chamar a adição de método sobrecarregada da AddEntity (Class Clazz) e você só precisa fornecer um nome de classe, sem o alias da tabela.
Obviamente, o Hibernate também suporta procedimentos armazenados. Você só precisa definir a propriedade Callable do SQL-Query como true no arquivo de configuração para indicar que os procedimentos armazenados atualmente chamados. Como não tenho muito contato com procedimentos armazenados, os estudarei mais no futuro e depois os estudarei com você.
Quando chamamos os métodos correspondentes de operações de dados, como session.Save, ele será convertido na instrução SQL integrada do Hibernate, mas e se quisermos controlar o formato da declaração SQL?
Hibernate realmente pensou nisso também.
Nós o adicionamos diretamente ao arquivo de mapeamento:
<SQL-Insert> Insira em T_USER (nome, idade) valores (?,?) </sql-insert> <sql-update> atualize o usuário definido user_name =?, idade =? Onde user_id =? </sql-update>
Observe que isso precisa ser adicionado na tag de classe como uma legenda. Somos todos letras maiúsculas aqui, para distingui -las das declarações padrão do Hibernate e não temos outro significado.
Vamos primeiro olhar para a chamada para inserir:
Usuário do usuário = novo usuário (); user.setName ("shun123123"); user.setage (23); Quando chamamos de salvamento, a declaração de hibernato é:
Hibernate:
Insira no usuário (user_name, idade) valores (?,?)
Ele chama as declarações na tag SQL-Insert que configuramos, vamos dar uma olhada na chamada para atualizar:
Usuário do usuário = (usuário) session.get (user.class, novo long (29)); user.setName ("shun123123"); user.setage (23); session.Save (usuário); Ligamos para salvar, ele ligará automaticamente na atualização e a declaração neste momento é:
Hibernate:
Atualize o usuário do usuário user_name =?, Idade =? Onde user_id =?Vemos que a declaração de saída é capitalizada, o que significa que a declaração que configuramos é chamada.