Exemples de requêtes nommées Hibernate

Exemples de requête nommée Hibernate

Souvent, le développeur aime mettre des littéraux de chaîne HQL dispersés partout dans le code Java, cette méthode est difficile à maintenir et à regarder laide. Heureusement, Hibernate a sorti une technique appelée «names queries», elle permet au développeur de mettre tout HQL dans le fichier de mappage XML ou via une annotation.

Comment déclarer une requête nommée

La requête nommée est prise en charge dans HQL ou SQL natif. voir des exemples…

1. Fichier de mappage XML

HQL dans le fichier de mappage


    
        
            
            
        
        
            
        
        ...
    

    
        
    

SQL natif dans le fichier de mappage


    
        
            
            
        
        
            
        
        ...
    

    
    
    
    

Vous pouvez placer une requête nommée dans l'élément 'hibernate-mapping', mais ne la mettez pas avant l'élément 'class', Hibernate demandera un fichier de mappage invalide, toutes vos requêtes nommées doivent être placées après le 'class 'élément.

Note
En ce qui concerne le CDATA, il est toujours bon d'encapsuler le texte de votre requête avec CDATA, afin que l'analyseur XML n'indique pas d'erreur pour certains caractères XML spéciaux tels que ">", <"et etc.

2. Annotation

HQL en annotation

@NamedQueries({
    @NamedQuery(
    name = "findStockByStockCode",
    query = "from Stock s where s.stockCode = :stockCode"
    )
})
@Entity
@Table(name = "stock", catalog = "example")
public class Stock implements java.io.Serializable {
...

SQL natif dans l'annotation

@NamedNativeQueries({
    @NamedNativeQuery(
    name = "findStockByStockCodeNativeSQL",
    query = "select * from stock s where s.stock_code = :stockCode",
        resultClass = Stock.class
    )
})
@Entity
@Table(name = "stock", catalog = "example")
public class Stock implements java.io.Serializable {
...

En SQL natif, vous devez déclarer les «resultClass» pour indiquer à Hibernate quel est le type de retour, si vous ne le faites pas, cela provoquera l'exception «org.hibernate.cfg.NotYetImplementedException: Pure native scalar queries are not yet supported».

Appeler une requête nommée

Dans Hibernate, vous pouvez appeler la requête nommée via la méthodegetNamedQuery.

Query query = session.getNamedQuery("findStockByStockCode")
.setString("stockCode", "7277");
Query query = session.getNamedQuery("findStockByStockCodeNativeSQL")
.setString("stockCode", "7277");

Conclusion

Les requêtes nommées sont un accès global, ce qui signifie que le nom d'une requête doit être unique dans les fichiers de mappage XML ou les annotations. Dans un environnement réel, il est toujours recommandé d'isoler toutes les requêtes nommées dans leur propre fichier. De plus, les requêtes nommées stockées dans les fichiers de mappage Hibernate ou les annotations sont plus faciles à gérer que les requêtes dispersées dans le code Java.