欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

jpa?EntityManager?復(fù)雜查詢實(shí)例

 更新時間:2021年12月07日 11:10:26   作者:xieyuanqiu  
這篇文章主要介紹了jpa?EntityManager?復(fù)雜查詢實(shí)例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

jpa EntityManager復(fù)雜查詢

概念

  • EntityManager:EntityManager是JPA中用于增刪改查的接口,它的作用相當(dāng)于一座橋梁,連接內(nèi)存中的java對象和數(shù)據(jù)庫的數(shù)據(jù)存儲??梢杂胓etCriteriaBuilder()的方式獲取CriteriaBuilder對象。
  • CriteriaBuilder接口:用于構(gòu)造標(biāo)準(zhǔn)查詢、復(fù)合條件、表達(dá)式、排序等??梢酝ㄟ^createQuery的方式獲取CriteriaQuery實(shí)例。
  • CriteriaQuery接口:代表一個specific的頂層查詢對象,它包含著查詢的各個部分,比如:select 、from、where、group by、order by。
  • Root接口:代表Criteria查詢的根對象,定義了實(shí)體類型,能為將來導(dǎo)航獲得想要的結(jié)果,它與SQL查詢中的FROM子句類似

接下來上代碼啦!

1. 注入entitymanager

@PersistenceContext
private EntityManager em;

2. 建立連接,執(zhí)行查詢操作

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<ADTO> q = cb.createQuery(ADTO.class);
Root<A> root = q.from(A.class);
/*********************表連接**************************/
Join<A, B> b = root.join("b", JoinType.LEFT);
Join<A, C> c = root.join("c", JoinType.LEFT);
Join<A, D> d = root.join("d", JoinType.LEFT);
Join<A, E> e = root.join("e",  JoinType.LEFT);
Join<A, F> f = root.join("f", JoinType.LEFT);
q.multiselect(//備注:ADTO要有對應(yīng)構(gòu)造函數(shù)哦
        root.get("id"),
        root.get("version"),
        root.get("code"),
        root.get("name"),
        root.get("isAlterable"),
        root.get("mustCharge"),
        root.get("isConsignment"),
        root.get("memo"),
        b.get("id"),
        b.get("name"),
        c.get("id"),
        c.get("description"),
        d.get("id"),
        d.get("name"),
        e.get("id"),
        e.get("name"),
        f.get("id"),
        f.get("name"),
        root.get("standardPrice"),
        root.get("upperPrice"),
        root.get("lowerPrice"),
        root.get("isActive")
);//還可以進(jìn)行where.order by等操作哦
List<ADTO> rs = em.createQuery(q).getResultList();

到此就完成啦?。?!

拓展

where條件

List<Predicate> predicates = new ArrayList<>();
CriteriaBuilder.In<String> in = cb.in(root.get("code").as(String.class));
for (String code: codes) {
    in.value(code);
}
predicates.add(in);
if (startDate != null && !"".equals(startDate)) {
    predicateList.add(cb.greaterThan(birthdayPath, startDate));
}
Predicate[] pre = new Predicate[predicates.size()];
q.where(predicates.toArray(pre));

or 條件拼接

public List<Predicate> getOrSearchPredicates(CriteriaBuilder cb, Root<T> root, String keywords){
        List<Predicate> predicates = new ArrayList<>();
        Predicate predicate = null;
        Predicate predicate1 = null;
        try {
            UUID uuid = UUID.fromString(keywords);
            predicate1 = cb.equal(root.get("id"), uuid);
        }catch (Exception e){
            log.info(e.getMessage());
        }finally {
            Predicate predicate2 = cb.like(root.get("code"), "%"+keywords+"%");
            Predicate predicate3 = cb.like(root.get("name"), "%"+keywords+"%");
            if (predicate1 != null){
                predicate = cb.or(predicate1, cb.or(predicate2,predicate3));
            } else {
                predicate = cb.or(predicate2, predicate3);
            }
        }
        predicates.add(predicate);
        return predicates;
}

JPA 動態(tài)更新

CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaUpdate<T> op=cb.createCriteriaUpdate(clazz);
Root<T> root=op.from(clazz);
op.set(fieldName, value);
op.where(cb.equal(root.get(keyName), delta.get(keyName)));
entityManager.createQuery(op).executeUpdate();

基于EntityManager的使用

1、最基礎(chǔ)的查詢

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> root = cq.from(User.class); //from User
cq.select(root); //select * from User
javax.persistence.criteria.Predicate pre = cb.equal(root.get("id").as(Integer.class),id);//id=1
cq.where(pre);//where id=1
Query query = entityManager.createQuery(cq);//select u from User u where u.id = 1
System.out.println(query.getResultList());

2、spring data jpa的toPredicate方法

public Predicate toPredicate(Root<RoleEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
    List<Predicate> list = new ArrayList<Predicate>();
    list.add(cb.equal(root.get("dr").as(Integer.class), delete));
    if (StringUtils.isNotBlank(searchParam)) {/*searchParam 為傳遞參數(shù)*/
        list.add(cb.or(cb.like(root.get("roleName").as(String.class), cb.literal("%" + searchParam + "%")), cb.like(root.get("roleCode").as(String.class), cb.literal("%" + searchParam + "%"))));
    }
    // 角色id
    if (roleId != null && !("".equals(roleId.trim()))) {
        list.add(cb.equal(root.get("id").as(String.class), roleId));
    }
    // 管理員角色標(biāo)識
    if (category != null && category > 0) {
        list.add(cb.equal(root.get("category").as(Integer.class), category));
    }
    //多角色I(xiàn)d
    if (roleids != null && roleids.size() > 0) {
        list.add(root.get("id").as(String.class).in(roleids));
    }
    Predicate[] predicates = new Predicate[list.size()];
    query.where(list.toArray(predicates));
    query.orderBy(cb.asc(root.get("roleType").as(String.class)), cb.asc(root.get("roleProperty").as(String.class)), cb.asc(root.get("roleCode").as(String.class)));
    return query.getRestriction();
}

參考 org.springframework.data.jpa.repository.support.SimpleJpaRepository 的 findAll方法,如下

public List<T> findAll(Specification<T> spec) {
    return getQuery(spec, (Sort) null).getResultList();
}
protected TypedQuery<T> getQuery(Specification<T> spec, Sort sort) {
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<T> query = builder.createQuery(getDomainClass());
    Root<T> root = applySpecificationToCriteria(spec, query);
    query.select(root);
    if (sort != null) {
        query.orderBy(toOrders(sort, root, builder));
    }
    return applyRepositoryMethodMetadata(em.createQuery(query));
}
private TypedQuery<T> applyRepositoryMethodMetadata(TypedQuery<T> query) {
    if (metadata == null) {
        return query;
    }
    LockModeType type = metadata.getLockModeType();
    TypedQuery<T> toReturn = type == null ? query : query.setLockMode(type);
    applyQueryHints(toReturn);
    return toReturn;
}

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring注解開發(fā)@Bean和@ComponentScan使用案例

    Spring注解開發(fā)@Bean和@ComponentScan使用案例

    這篇文章主要介紹了Spring注解開發(fā)@Bean和@ComponentScan使用案例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • 淺談mybatis中的#和$的區(qū)別

    淺談mybatis中的#和$的區(qū)別

    下面小編就為大家?guī)硪黄獪\談mybatis中的#和$的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • 詳解Idea中HTTP Client請求測試工具的使用

    詳解Idea中HTTP Client請求測試工具的使用

    今天抽空給大家分享Idea中HTTP Client請求測試工具的使用,小編在這建議使用HTTP Client的Idea版本最好在2018以上,不然的話體驗(yàn)不是多好,今天就給大家介紹Idea中HTTP Client怎么使用的,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • java泛型學(xué)習(xí)示例

    java泛型學(xué)習(xí)示例

    Java泛型(Generics)是JDK5開始引入的一個新特性,允許在定義類和接口的時候使用類型參數(shù)(Type Parameter)。下面是學(xué)習(xí)泛型的示例
    2014-04-04
  • mybatis3中@SelectProvider傳遞參數(shù)方式

    mybatis3中@SelectProvider傳遞參數(shù)方式

    這篇文章主要介紹了mybatis3中@SelectProvider傳遞參數(shù)方式。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java界面編程實(shí)現(xiàn)界面跳轉(zhuǎn)

    Java界面編程實(shí)現(xiàn)界面跳轉(zhuǎn)

    這篇文章主要為大家詳細(xì)介紹了Java界面編程實(shí)現(xiàn)界面跳轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 使用SpringBoot整合ssm項(xiàng)目的實(shí)例詳解

    使用SpringBoot整合ssm項(xiàng)目的實(shí)例詳解

    Spring Boot 現(xiàn)在已經(jīng)成為 Java 開發(fā)領(lǐng)域的一顆璀璨明珠,它本身是包容萬象的,可以跟各種技術(shù)集成。這篇文章主要介紹了使用SpringBoot整合ssm項(xiàng)目,需要的朋友可以參考下
    2018-11-11
  • Java中獲取鍵盤輸入值的三種方法介紹

    Java中獲取鍵盤輸入值的三種方法介紹

    這篇文章主要介紹了Java中獲取鍵盤輸入值的三種方法介紹,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 基于Java數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列的兩種方法小結(jié)

    基于Java數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列的兩種方法小結(jié)

    下面小編就為大家分享一篇基于Java數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列的兩種方法小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • 使用Java實(shí)現(xiàn)簡單搭建內(nèi)網(wǎng)穿透

    使用Java實(shí)現(xiàn)簡單搭建內(nèi)網(wǎng)穿透

    內(nèi)網(wǎng)穿透是一種網(wǎng)絡(luò)技術(shù),適用于需要遠(yuǎn)程訪問本地部署服務(wù)的場景,本文主要為大家介紹了如何使用Java實(shí)現(xiàn)簡單搭建內(nèi)網(wǎng)穿透,感興趣的可以了解下
    2024-02-02

最新評論