国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

擁抱JPA規范

pubdreamcc / 3250人閱讀

摘要:前言在上文使用中曾經提到過是實現的一個超集,但當時使用的都是原生,在本文中我們將擁抱規范,重構持久化層。

前言

在上文Hibernate使用中曾經提到過Hibernate是JPA實現的一個超集,但當時使用的都是原生Hibernate,在本文中我們將擁抱JPA規范,重構持久化層。

JPA+HIbernate配置

下面是ApplicationContxt文件

XML
        
        
        
            
        
        
            
                update
                org.hibernate.dialect.MySQLDialect
                true
            
        
    

    
        
    


    

      
         
         
      
JPA動態查詢
javaCriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery query=cb.createQuery(clazz);
//clazz是你想要轉換的類型,就是你的Entity.claa,如果你查的是count,就是Long.claa
Root root=query.from(clazz);
query.select(root);//選取實體

//選擇的條件
List predicates=new ArrayList();
predicates.add(cb.equal(..));
predicates.add(..);
...
query.where(cb.and(predicates.toArray(new Predicate[predicates.size()])));

上面通過數組來組合與條件,還有一種方式:

javaPredicate predicate=cb.conjunction();//交集
predicate=cb.and(predicate,cb.equal(root.get("sex"),condition.get("sex")));

Predicate predicate=cb.disjunction();//并集
predicate=cb.or(predicate,cb.equal(root.get("sex"),condition.get("sex")));

JPA里面對類型控制比較嚴格,如下所示:

java//比較大小
cb.gt(root.get("degree"),(Integer) condition.get("degree"));

//like
cb.like(root.get("user"). get("nickName"),keyword)

//in 條件
root.get("tags").in(condition.get("tag"))

對于關聯映射,如果是ToOne,你可以連寫get

root.get("user").get("account");

對于ToMany的,你可以使用Join

javaCriteriaQuery criteria = cb.createQuery((Class) Parent.class);
Root parent = criteria.from(Parent.class);

criteria.select((Selection) parent);
SetJoin children = parent.joinSet("children", JoinType.LEFT);

Predicate sexPredicate = cb.equal(children.get("sex"), "MALE");
parent.fetch(children);
//parent.fetch("children");//try also this

criteria.where(sexPredicate);
JPA分頁

取分頁內容

javaTypedQuery typedQuery=entityManager.createQuery(query);
typedQuery.setFirstResult((pageNum-1)*PAGE_SIZE);
typedQuery.setMaxResults(PAGE_SIZE);

取查詢數目

javaCriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery query=cb.createQuery(Long.class);
query.select(cb.count(query.from(clazz)));//選取實體
return entityManager.createQuery(query).getSingleResult();
JPA 動態更新
javaCriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaUpdate op=cb.createCriteriaUpdate(clazz);
Root root=op.from(clazz);
op.set(fieldName, value);
op.where(cb.equal(root.get(keyName), delta.get(keyName)));
entityManager.createQuery(op).executeUpdate();
JPQL

JPA的JPQL語句和Hibernate的HQL語句十分類似

javaQuery query=entityManager.createQuery("SELECT r FROM Resume r WHERE r.user.id=:userId");
query.setParameter("id", userId);
return (Resume) query.getSingleResult();
JPA CRUD
javapublic interface GenericDAO {
    public void insert(T t);

    public void update(T t);

    public void simpleUpdate(Map delta);

    public void delete(T t);

    public T load(Long id);

    public void refresh(T t);

    public List list(int pageNum);

    public Long count();

    public List findByCondition(Map condition);

    public Long countByCondition(Map condition);
}

@SuppressWarnings("unchecked")
public class GenericDAOImpl implements GenericDAO {

    private Class clazz;

    @PersistenceContext
    protected EntityManager entityManager;



    protected Session getCurrentSession() {
        return entityManager.unwrap(Session.class);
    }

    public GenericDAOImpl(){
        //取得T的類型變量
        ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
        clazz = (Class) type.getActualTypeArguments()[0];
    }

    public void insert(T t) {
        entityManager.persist(t);
    }

    public void update(T t) {
        entityManager.merge(t);
    }

    public void simpleUpdate(Map delta) {
        Field[] fields=clazz.getDeclaredFields();
        CriteriaBuilder cb=entityManager.getCriteriaBuilder();
        CriteriaUpdate op=cb.createCriteriaUpdate(clazz);
        Root root=op.from(clazz);

        String keyName="id";//默認選擇基準為Id

        //調整選擇域
        if(delta.containsKey("keyName")) keyName=(String) delta.get("keyName");

        for(Field field:fields){
            String fieldName=field.getName();
            if(fieldName==keyName) continue;
            if(delta.containsKey(fieldName)){
                op.set(fieldName, delta.get(fieldName));
            }
        }

        op.where(cb.equal(root.get(keyName), delta.get(keyName)));
        entityManager.createQuery(op).executeUpdate();
    }

    public void delete(T t) {
        entityManager.remove(t);
    }

    public T load(Long id) {
        return (T) entityManager.find(clazz, id);
    }


    public List list(int pageNum) {
        CriteriaBuilder cb=entityManager.getCriteriaBuilder();
        CriteriaQuery query=cb.createQuery(clazz);
        Root root=query.from(clazz);
        query.select(root);//選取實體
        query.orderBy(cb.desc(root.get("created")));//排序
        TypedQuery typedQuery=entityManager.createQuery(query);
        if(pageNum>0){
            typedQuery.setFirstResult((pageNum-1)*SbeatConfig.PAGE_SIZE);
            typedQuery.setMaxResults(SbeatConfig.PAGE_SIZE);
        }

        return typedQuery.getResultList();
    }

    public void refresh(T t) {
        entityManager.refresh(t);
    }

    public Long count() {
        //返回數目
        CriteriaBuilder cb=entityManager.getCriteriaBuilder();
        CriteriaQuery query=cb.createQuery(Long.class);
        query.select(cb.count(query.from(clazz)));//選取實體
        return entityManager.createQuery(query).getSingleResult();
    }




    public List findByCondition( Map condition) {
        Field[] fields=clazz.getDeclaredFields();
        CriteriaBuilder cb=entityManager.getCriteriaBuilder();
        CriteriaQuery query=cb.createQuery(clazz);
        Root root=query.from(clazz);
        query.select(root);//選取實體

        //選擇的條件
        List predicates=new ArrayList();
        for(Field field:fields){
            String fieldName=field.getName();
            if(condition.containsKey(fieldName)){
                predicates.add(cb.equal(root.get(fieldName), condition.get(fieldName)));
            }
        }
        query.where(cb.and(predicates.toArray(new Predicate[predicates.size()])));
        query.orderBy(cb.desc(root.get("created")));
        TypedQuery typedQuery=entityManager.createQuery(query);

        Integer pageNum=0;
        if(condition.containsKey(pageNum)){
            pageNum=(Integer) condition.get("pageNum");
        }
        if(pageNum>0){
            typedQuery.setFirstResult((pageNum-1)*SbeatConfig.PAGE_SIZE);
            typedQuery.setMaxResults(SbeatConfig.PAGE_SIZE);
        }
        return typedQuery.getResultList();
    }

    public Long countByCondition(Map condition) {
        Field[] fields=clazz.getDeclaredFields();
        CriteriaBuilder cb=entityManager.getCriteriaBuilder();
        CriteriaQuery query=cb.createQuery(Long.class);
        Root root=query.from(clazz);
        query.select(cb.count(root));//選取實體

        List predicates=new ArrayList();
        for(Field field:fields){
            String fieldName=field.getName();
            if(condition.containsKey(fieldName)){
                predicates.add(cb.equal(root.get(fieldName), condition.get(fieldName)));
            }
        }
        query.where(cb.and(predicates.toArray(new Predicate[predicates.size()])));
        return entityManager.createQuery(query).getSingleResult();
    }

}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64396.html

相關文章

  • SpringBoot 實戰 (八) | 使用 Spring Data JPA 訪問 Mysql 數據

    摘要:是一個基于映射的標準協議目前最新版本是。的主要實現由和等完成,我們只要使用來開發,無論是哪一個開發方式都是一樣的。是的一個子項目,它通過基于的極大地減少了作為數據訪問方案的代碼量。源碼下載后語以上為使用訪問數據庫的教程。 微信公眾號:一個優秀的廢人如有問題或建議,請后臺留言,我會盡力解決你的問題。 前言 如題,今天介紹 Spring Data JPA 的使用。 什么是 Spring D...

    hedzr 評論0 收藏0
  • Spring Boot 的簡單教程(四)數據庫連接之Spring Data JPA的使用

    摘要:以前都是用進行數據庫的開發,最近學習之后發現顯得更友好,所以我們就一起來了解一下的原理吧。簡單介紹持久性是的一個規范。它用于在對象和關系數據庫之間保存數據。充當面向對象的領域模型和關系數據庫系統之間的橋梁。是標識出主鍵是指定主鍵的自增方式。 以前都是用Mybatis進行數據庫的開發,最近學習Spring Boot之后發現JPA顯得更友好,所以我們就一起來了解一下JPA的原理吧。 Spr...

    yuxue 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<