javascript
将原生SQL功能Hibernate到您的Spring Data Repository中
對于以前使用過Hibernate本機SQL功能的用戶,您會發(fā)現(xiàn)它比JPA的@NamedNativeQuery更易于使用。 在最近的項目中,我正在使用Spring Data JPA。 我已將Hibernate的本機查詢功能添加到我的Spring數(shù)據(jù)庫中。 現(xiàn)在,您可以在JPA中執(zhí)行本機查詢,而無需使用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.在基礎(chǔ)Spring Data Repository中添加“ queryNatively”方法。
如果您不知道如何向Spring數(shù)據(jù)JPA基礎(chǔ)存儲庫添加自定義行為,請參閱我以前的文章, 了解如何自定義Spring數(shù)據(jù)JPA基礎(chǔ)存儲庫 。 您可以在上一篇文章中看到,我有意在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查詢。 用法與調(diào)用Hibernate本機查詢功能相似。 您可能只看到Hibernate別名和屬性引用 。
@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> { }在注入存儲庫的服務(wù)或業(yè)務(wù)類中,您只需簡單地調(diào)用queryNatively()方法即可執(zhí)行本機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
總結(jié)
以上是生活随笔為你收集整理的将原生SQL功能Hibernate到您的Spring Data Repository中的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何将文件从PC传输到笔记本电脑电脑之间
- 下一篇: 光盘应该怎么刻录了如何在电脑上刻录光盘