Примеры именованных запросов Hibernate

Примеры именованных запросов Hibernate

Часто разработчикам нравится размещать строковые литералы HQL по всему Java-коду, этот метод трудно поддерживать и выглядит уродливо. К счастью, в Hibernate появилась технология под названием «names queries», которая позволяет разработчику помещать весь HQL в файл сопоставления XML или с помощью аннотации.

Как объявить именованный запрос

Именованный запрос поддерживается как в HQL, так и в собственном SQL. смотрите примеры ...

1. XML-файл отображения

HQL в файле отображения



    
        
            
            
        
        
            
        
        ...
    

    
        
    

Собственный SQL в файле отображения



    
        
            
            
        
        
            
        
        ...
    

    
    
    
    

Вы можете разместить именованный запрос внутри элемента 'hibernate-mapping', но не помещайте его перед элементом 'class', Hibernate выдаст запрос неверного файла сопоставления, все ваши именованные запросы должны быть помещены после 'class 'элемент.

Note
Что касается CDATA, всегда рекомендуется заключать текст запроса в CDATA, чтобы синтаксический анализатор XML не вызывал ошибку для некоторых специальных символов XML, таких как ‘>’, <‘и т. д.

2. аннотирование

HQL в аннотации

@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 в аннотации

@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 {
...

В собственном SQL вы должны объявить «resultClass», чтобы Hibernate узнал, какой тип возвращаемого значения, если это не сделать, вызовет исключение «org.hibernate.cfg.NotYetImplementedException: Pure native scalar queries are not yet supported».

Вызов именованного запроса

В Hibernate вы можете вызвать именованный запрос с помощью методаgetNamedQuery.

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

Заключение

Именованные запросы имеют глобальный доступ, что означает, что имя запроса должно быть уникальным в файлах отображения XML или аннотациях. В реальной среде всегда полезно изолировать все именованные запросы в отдельный файл. Кроме того, именованные запросы, хранящиеся в файлах отображения или аннотации Hibernate, проще обслуживать, чем запросы, разбросанные по коду Java.