Рубрики
Без рубрики

Примеры именованных запросов в режиме гибернации

– Примеры именованных запросов в режиме гибернации

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

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

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

1. Файл сопоставления XML

HQL в файле сопоставления



    
        
            
            
        
        
            
        
        ...
    

    
        
	

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



    
        
            
            
        
        
            
        
        ...
    

    
	
	

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

2. Аннотация

HQL в аннотации

@NamedQueries({
	@NamedQuery(
	name = "findStockByStockCode",
	query = "from Stock s where s.stockCode = :stockCode"
	)
})
@Entity
@Table(name = "stock", catalog = "mkyong")
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 = "mkyong")
public class Stock implements java.io.Serializable {
...

В родном SQL вы должны объявить ” класс результата “, чтобы сообщить Hibernate, какой тип возвращаемого значения, если этого не сделать, возникнет исключение” org.hibernate.cfg. Исключение NotYetImplementedException: Чистые собственные скалярные запросы пока не поддерживаются “.

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

В режиме гибернации вы можете вызвать именованный запрос через getNamedQuery метод.

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

Вывод

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

Оригинал: “https://mkyong.com/hibernate/hibernate-named-query-examples/”