对于以前使用过Hibernate本机SQL功能的用户,您会发现它比JPA的@NamedNativeQuery更易于使用。 在最近的项目中,我正在使用Spring Data JPA。 我已将休眠的本机查询功能添加到我的Spring数据库中。 现在,您可以在JPA中执行本机查询,而无需使用SqlResultSetMapping。
1.添加您的客户注释@NativeQueries和@NativeQuery
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface NativeQueries {NativeQuery[] queries() default {};
}
@Retention(RetentionPolicy.RUNTIME)
public @interface NativeQuery {String name() default "";String sql() default "";
}
2.在基本Spring Data Repository中添加方法“ queryNatively”。
如果您不知道如何向Spring数据JPA基础存储库添加自定义行为,请参阅我以前的文章, 了解如何自定义Spring数据JPA基础存储库 。 您可以在上一篇文章中看到,我有意在GenericRepositoryImpl中公开存储库接口(即springDataRepositoryInterface属性)。 这些小技巧使我可以轻松地访问存储库界面中的注释。
public List queryNatively(String nativeQueryName, LinkedHashMap<String,Class<?>> inEntityClasses, Map inParams ){SQLQuery query = this.createHibernateNativeQuery( nativeQueryName, inParams );//add entitiesif (inEntityClasses!=null) { for (Object key: inEntityClasses.keySet()) {String entityClassAlias = key.toString();Class<?> entityClass = (Class<?>)inEntityClasses.get(key); query.addEntity(entityClassAlias,entityClass);} }//add parameterif (inParams != null){for (Object key: inParams.keySet()) {String queryParamName = key.toString();Object queryParamValue = inParams.get(key);query.setParameter(queryParamName, queryParamValue);}} return (query!=null)? query.list() : null ;}private SQLQuery createHibernateNativeQuery (String nativeQueryName, Map inParams ){if (GenericRepository.class.isAssignableFrom(getSpringDataRepositoryInterface())) {Annotation nativeQueryAnn = getSpringDataRepositoryInterface().getAnnotation(NativeQueries.class);if(nativeQueryAnn != null){NativeQueries nativeQueries = (NativeQueries)nativeQueryAnn;NativeQuery[] queries = nativeQueries.queries();for (NativeQuery sqlquery : queries) { if (StringUtils.equals(nativeQueryName, sqlquery.name())) {String sql = sqlquery.sql();Session hiernateSess = em.unwrap(Session.class);SQLQuery query = hiernateSess.createSQLQuery(sql);//add parameterif (inParams != null){for (Object key: inParams.keySet()) {String queryParamName = key.toString();Object queryParamValue = inParams.get(key);query.setParameter(queryParamName, queryParamValue);}} return query;} }}}return null;}
3.示例用法
在存储库界面中,通过@NativeQueries和@NativeQuery批注定义要使用的本机SQL查询。 用法与调用休眠本机查询功能相似。 您可能只看到休眠别名和属性引用 。
@NativeQueries (queries = {@NativeQuery(name="query1", sql="SELECT {cat.*}, {mother.*} FROM CATS c, CATS m WHERE c.MOTHER_ID = c.ID and c.name = :catName "),@NativeQuery(name="query2", sql="SELECT {cat.*} FROM CATS where c.ID = :catName") }
)
public interface CatRepository extends GenericRepository<Cat, Long> {
}
在注入存储库的服务或业务类中,您只需简单地调用queryNatively()方法即可执行本机SQL查询。
@Service
public class CatService {@Injectprivate CatRepository catRepository;public List<Cat> searchCat( String catName) {List<Cat> catList;// Add entity mapping for your queryHashMap<String, Object> inParams = new HashMap<String, Object>();inParams.put("catName", "Felix");// Prepare parameters for your native sqlLinkedHashMap<String, Object> entityMap = new LinkedHashMap<String, Object>();entityMap.put("cat", Cat.class);entityMap.put("mother",Mother.class);catList = catRepository.queryNatively("query1", "",entityParam);return catList;}
}
参考:来自Programming Peacely博客的JCG合作伙伴 Boris Lam 向您的Spring Data Repository中添加了Hibernate本机SQL功能 。
翻译自: https://www.javacodegeeks.com/2012/08/hibernate-native-sql-features-into-your.html