黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 JPA多表查詢的方法

JPA多表查詢的方法

更新時間:2022-07-20 05:50:01 來源:動力節(jié)點(diǎn) 瀏覽2277次

JPA多表查詢的方法有哪些?動力節(jié)點(diǎn)小編來告訴大家。

例子1:

使用實(shí)體類 User 中的多個屬性進(jìn)行過濾。

1.名稱

2.身份證

3.手機(jī)號碼

這是一個單表的多條件復(fù)雜查詢。因?yàn)槭窃诙鄠€屬性中過濾的,其中屬性的個數(shù)不知道有多少,所以只用規(guī)范查詢就可以很方便的實(shí)現(xiàn)這個需求。見下面代碼:

場景:在頁面上通過條件過濾查詢用戶列表

頁面上有三個條件設(shè)置了id為searchName、searchId和searchMobile。因?yàn)檫@是user表,所以userRepository繼承了JpaSpecificationExecutor接口,然后我創(chuàng)建了一個封裝條件的類。

public class PageParam<T> {
    private Integer pageSize = 10;
    private Integer pageNumber = 1;
    private String searchName;
    private String searchMobile;
    private String searchId;
}

由于這個方法是直接分頁的,pageNumber和pageSize也可以直接寫到這個類中,方便參數(shù)的接收,主要封裝了以下三個參數(shù)。

Specification<T> specification = new Specification<T>() {
    @Override
    public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
        List<Predicate> list = new ArrayList<Predicate>();
        if (StringUtils.isNotBlank(searchName)) {
            list.add(cb.like(root.get("name").as(String.class), "%" + searchName + "%"));
        }
        if (StringUtils.isNotBlank(searchId)) {
            list.add(cb.equal(root.get("id").as(Long.class), searchId));
        }
        if (StringUtils.isNotBlank(searchMobile)) {
            list.add(cb.like(root.get("mobile").as(String.class), "%" + searchMobile + "%"));
        }
        Predicate[] p = new Predicate[list.size()];
        return cb.and(list.toArray(p));
    };
};

因?yàn)檫@里都是一張表,只要root.get('N') N對應(yīng)要檢查的屬性名,屬性名重要的事情說三遍。

接下來我們來看一組多表查詢

例子2:

這里有四張桌子。

public class Living {
    Long id;    
    @ManyToOne
    @JsonIgnore
    @JoinColumn(name = "actorId", foreignKey = @ForeignKey(name = "none", value =ConstraintMode.NO_CONSTRAINT))
    public Actor actor;    
   @ManyToOne
    @JsonIgnore
    @JoinColumn(name = "regionId", foreignKey = @ForeignKey(name = "none", value =ConstraintMode.NO_CONSTRAINT))
    public Region region;
}    
public class Actor {
    Long id;    
    @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }, fetch = FetchType.LAZY)
    @JoinColumn(name = "actorId")
    @org.hibernate.annotations.ForeignKey(name = "none")
    List<Living> livings = new ArrayList<>();    
   @OneToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }, fetch = FetchType.LAZY)
    @org.hibernate.annotations.ForeignKey(name = "none")
    @JoinColumn(name = "userDetailId", foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
    UserDetail userDetail;    
   @Column(nullable = false)
    @Enumerated(value = EnumType.ORDINAL)
    ActorType actorType = ActorType.A;    
    public enum ActorType{
        A,B,C
    }
}    
public class UserDetail {
    Long id;     
   @OneToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }, fetch = FetchType.LAZY)
    @org.hibernate.annotations.ForeignKey(name = "none")
    @JoinColumn(name = "actorId", foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
    Actor actor;    
    String truename;
}   
public class Region {
    Long id;    
    String name;    
    @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }, fetch = FetchType.LAZY)
    @JoinColumn(name = "regionId")
    @org.hibernate.annotations.ForeignKey(name = "none")
    List<Living> Livings;
}

現(xiàn)在我們需要根據(jù)userdetai的sex actor的actortype和region的id來查詢符合條件的live。

public class PageParam<Living> {
    private Integer pageSize = 10;
    private Integer pageNumber = 1;
    private Sex sex;
    private ActorType actortype;
    private Long cityid;

首先,我封裝了這樣一個類,但是我把泛型類型直接賦予了想要的查詢結(jié)果。接下來因?yàn)樯婕暗蕉啾聿樵儯陨厦鎲伪聿樵兊睦右呀?jīng)不適合這個查詢了,但是Criteria的join方法為我們提供了一個方法。

Specification<Living> specification = new Specification<Living>() {
    @Override
    public Predicate toPredicate(Root<Living> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
        List<Predicate> list = new ArrayList<Predicate>();
        if (null!=sex) {
            Join<UserDetail, Living> join = root.join("actor", JoinType.LEFT);
            list.add(cb.equal(join.get("userDetail").get("sex"),  sex ));
        }
        if (null!=actortype) {
            Join<Actor, Living> join = root.join("actor", JoinType.LEFT);
            list.add(cb.equal(join.get("actorType"),  actortype));
        }
        if (null!=cityid) {
            Join<Region, Living> join = root.join("region", JoinType.LEFT);
            list.add(cb.equal(join.get("id"), cityid));
        }
        //Join<A, B> join = root.join("bs", JoinType.LEFT);
        //list.add(cb.equal(join.get("c").get("id"), id));
        Predicate[] p = new Predicate[list.size()];
        return cb.and(list.toArray(p));
    };
};

jpa的多條件查詢主要是根據(jù)Criteria提供的方法對條件進(jìn)行封裝,然后根據(jù)為條件定義的位置重新生成sql語句,然后完成查詢。

不得不說的是,在這個多表查詢中,以下面這句話為例。

Join<UserDetail, Living> join = root.join("actor", JoinType.LEFT);
list.add(cb.equal(join.get("userDetail").get("sex"),  sex ));

LEFT主要是指最終屬性在哪個表,而前面的“actor”代表從活表查詢的第一步。比如我給出的例子是查詢living中的actor,然后在userdetail中的sex屬性之前查詢actor中的user表。join.get("userDetail")。get("sex"),這里是取出對應(yīng)的屬性,直到得到想要的屬性。接下來的兩個屬性是一樣的。

很多人對jpa有很大的誤解。他們認(rèn)為jpa的多表多條件復(fù)雜查詢不如mybatis的查詢。如果大家對此感興趣,還可以了解一下什么是JPA框架,希望對大家的學(xué)習(xí)能夠有所幫助。

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 亚欧精品一区二区三区四区 | 亚洲一区欧美 | 德国最新精品性hd | 欧美久在线观看在线观看 | 综合色吧| 欧美激情欧美狂野欧美精品免费 | 久久看免费 | 鲁丝片一区二区三区免费 | 9191亚洲高清国产 | 亚洲欧美另类一区 | 国产亚洲精品精品国产亚洲综合 | 欧美五月激情 | 免费一级毛片在播放视频 | 日日摸夜夜摸狠狠摸日日碰夜夜做 | 欧美日韩在线精品成人综合网 | 不卡视频一区 | 亚洲 欧美 日韩在线 | 老司机日日摸夜夜摸精品影院 | 性一级录像 | 天天干天天操天天舔 | 亚洲成a人片在线观看播放 亚洲成精品动漫久久精久 亚洲大尺度 | 又爽又黄| 欧美一级手机免费观看片 | xxx性欧美人| 中文精品北条麻妃中文 | 亚洲三级黄 | www日韩在线 | 免费一级e一片在线播放 | 精品无码久久久久久久动漫 | 亚洲成成熟老妇女 | 日本欧美视频在线观看 | 亚洲最大成人在线 | 国产精品va在线观看手机版 | 国产色噜噜 | 91精选视频在线观看 | 很黄很色又爽很黄很色又爽 | 日本高清视频成人网www | 色偷偷av男人的天堂 | 香蕉久久综合 | 日本资源网 | 夜夜嗨视频网 |