中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springdata jpa如何使用Example快速實現動態查詢功能

發布時間:2021-11-18 13:00:56 來源:億速云 閱讀:434 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關springdata jpa如何使用Example快速實現動態查詢功能,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

    Example官方介紹

    Query by Example (QBE) is a user-friendly querying technique with a simple interface. It allows dynamic query creation and does not require to write queries containing field names. In fact, Query by Example does not require to write queries using store-specific query languages at all.

    谷歌翻譯:

    按例查詢(QBE)是一種用戶界面友好的查詢技術。 它允許動態創建查詢,并且不需要編寫包含字段名稱的查詢。 實際上,按示例查詢不需要使用特定的數據庫的查詢語言來編寫查詢語句。

    Example api的組成

    • Probe:含有對應字段的實例對象。

    • ExampleMatcher:ExampleMatcher攜帶有關如何匹配特定字段的詳細信息,相當于匹配條件。

    • Example:由Probe和ExampleMatcher組成,用于查詢。

    限制

    • 屬性不支持嵌套或者分組約束,比如這樣的查詢 firstname = ?0 or (firstname = ?1 and lastname = ?2)

    • 靈活匹配只支持字符串類型,其他類型只支持精確匹配

    Limitations

    1. No support for nested/grouped property constraints like firstname = ?0 or (firstname = ?1 and lastname = ?2)

    2. Only supports starts/contains/ends/regex matching for strings and exact matching for other property types

    使用

    創建實體映射:

    @Entity
    @Table(name="t_user")
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        @Column(name="username")
        private String username;
        @Column(name="password")
        private String password;
        @Column(name="email")
        private String email;
        @Column(name="phone")
        private String phone;
        @Column(name="address")
        private String address;
    }

    測試查詢

    @Test
    public void contextLoads() {
        User user = new User();
        user.setUsername("admin");
        Example<User> example = Example.of(user);
        List<User> list = userRepository.findAll(example);
        System.out.println(list);
    }

    打印的sql語句如下:

    Hibernate: 
        select
            user0_.id as id1_0_,
            user0_.address as address2_0_,
            user0_.email as email3_0_,
            user0_.password as password4_0_,
            user0_.phone as phone5_0_,
            user0_.username as username6_0_ 
        from
            t_user user0_ 
        where
            user0_.username=?

    可以發現,試用Example查詢,默認情況下會忽略空值,官方文檔也有說明:

    This is a simple domain object. You can use it to create an Example. By default, fields having null values are ignored, and strings are matched using the store specific defaults. Examples can be built by either using the of factory method or by using ExampleMatcher. Example is immutable.

    在上面的測試之中,我們只是只是定義了Probe而沒有ExampleMatcher,是因為默認會不傳時會使用默認的匹配器。點進方法可以看到下面的代碼:

    static <T> Example<T> of(T probe) {
        return new TypedExample(probe, ExampleMatcher.matching());
    }
    static ExampleMatcher matching() {
        return matchingAll();
    }
    static ExampleMatcher matchingAll() {
        return (new TypedExampleMatcher()).withMode(ExampleMatcher.MatchMode.ALL);
    }

    自定匹配器規則

    @Test
    public void contextLoads() {
        User user = new User();
        user.setUsername("y");
        user.setAddress("sh");
        user.setPassword("admin");
        ExampleMatcher matcher = ExampleMatcher.matching()
                .withMatcher("username", ExampleMatcher.GenericPropertyMatchers.startsWith())//模糊查詢匹配開頭,即{username}%
                .withMatcher("address" ,ExampleMatcher.GenericPropertyMatchers.contains())//全部模糊查詢,即%{address}%
                .withIgnorePaths("password");//忽略字段,即不管password是什么值都不加入查詢條件
        Example<User> example = Example.of(user ,matcher);
        List<User> list = userRepository.findAll(example);
        System.out.println(list);
    }

    打印的sql語句如下:

    select
        user0_.id as id1_0_,
        user0_.address as address2_0_,
        user0_.email as email3_0_,
        user0_.password as password4_0_,
        user0_.phone as phone5_0_,
        user0_.username as username6_0_ 
    from
        t_user user0_ 
    where
        (
            user0_.username like ?
        ) 
        and (
            user0_.address like ?
        )

    參數如下:

    2018-03-24 13:26:57.425 TRACE 5880 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - [y%]
    2018-03-24 13:26:57.425 TRACE 5880 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [VARCHAR] - [%sh%]

    補充

    官方創建ExampleMatcher例子(1.8 lambda)

    ExampleMatcher matcher = ExampleMatcher.matching()
      .withMatcher("firstname", match -> match.endsWith())
      .withMatcher("firstname", match -> match.startsWith());
    }

    StringMatcher 參數

    Matching生成的語句說明
    DEFAULT (case-sensitive)firstname = ?0默認(大小寫敏感)
    DEFAULT (case-insensitive)LOWER(firstname) = LOWER(?0)默認(忽略大小寫)
    EXACT (case-sensitive)firstname = ?0精確匹配(大小寫敏感)
    EXACT (case-insensitive)LOWER(firstname) = LOWER(?0)精確匹配(忽略大小寫)
    STARTING (case-sensitive)firstname like ?0 + ‘%'前綴匹配(大小寫敏感)
    STARTING (case-insensitive)LOWER(firstname) like LOWER(?0) + ‘%'前綴匹配(忽略大小寫)
    ENDING (case-sensitive)firstname like ‘%' + ?0后綴匹配(大小寫敏感)
    ENDING (case-insensitive)LOWER(firstname) like ‘%' + LOWER(?0)后綴匹配(忽略大小寫)
    CONTAINING (case-sensitive)firstname like ‘%' + ?0 + ‘%'模糊查詢(大小寫敏感)
    CONTAINING (case-insensitive)LOWER(firstname) like ‘%' + LOWER(?0) + ‘%'模糊查詢(忽略大小寫)

    說明:

    1. 在默認情況下(沒有調用withIgnoreCase())都是大小寫敏感的。

    2. api之中還有個regex,但是我在mysql下測試報錯,不了解具體作用。

    關于“springdata jpa如何使用Example快速實現動態查詢功能”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    泉州市| 洪江市| 叶城县| 巴楚县| 襄汾县| 祁门县| 白城市| 唐河县| 南城县| 柳河县| 都江堰市| 信宜市| 建昌县| 连南| 邳州市| 玛曲县| 沁阳市| 富裕县| 海口市| 依兰县| 远安县| 克拉玛依市| 新郑市| 荔波县| 阜城县| 天台县| 胶州市| 麻城市| 措美县| 江门市| 嘉鱼县| 金华市| 密山市| 吴忠市| 忻城县| 颍上县| 通辽市| 会泽县| 梨树县| 潼南县| 桦甸市|