最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

DoytoQuery中的查詢映射方案詳解

 更新時(shí)間:2022年12月27日 16:17:56   作者:DOYToWin  
這篇文章主要為大家介紹了DoytoQuery中的查詢映射方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

DoytoQuery作為一個(gè)ORM框架,在研發(fā)過(guò)程中積累了很多全新的思路和解決方案,其中一個(gè)核心方案就是將查詢對(duì)象的字段映射為SQL語(yǔ)句中的WHERE條件進(jìn)行動(dòng)態(tài)查詢,目前支持四種字段映射方式。

讓我們看看如何為以下UserEntity編寫(xiě)查詢對(duì)象:

@Getter
@Setter
@Entity
public class UserEntity extends AbstractPersistable<Integer> {
    private String username;
    private String email;
    private String mobile;
    private String password;
    private String nickname;
    private Boolean valid;
}

四種字段映射方式詳解

1. 后綴映射

先定義一個(gè)類(lèi)UserQuery, 對(duì)于一些常見(jiàn)的查詢條件,比如id = ?username = ? and valid = ?等,我們只需要在UserQuery類(lèi)中定義如下字段即可。

@Getter
@Setter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class UserQuery extends PageQuery {
    private Integer id;
    private String username;
    private Boolean valid;
}

像其他一些常用的比較符號(hào). [NOT] LIKE><!=>=<=IS [NOT] NULL[NOT] IN, 我們需要在列名后加一些特定的后綴作為字段名稱(chēng)來(lái)標(biāo)識(shí)對(duì)應(yīng)的條件符號(hào)。比如,將idIn映射為id IN (?,?,?), 將idGt映射為id > ?, 將usernameLike映射為username LIKE ?, 還需要定義好對(duì)應(yīng)的類(lèi)型。

public class UserQuery extends PageQuery {
    private Integer id;
    private String username;
    private Boolean valid;
    private List<Integer> idIn;
    private Integer idGt;
    private String usernameLike;
}

只有值不為NULL的字段才會(huì)被映射,并且多個(gè)條件由AND連接。

UserQuery userQuery = UserQuery.builder().usernameLike("test").valid(true).build();

這個(gè)userQuery會(huì)被映射為如下查詢語(yǔ)句以及對(duì)應(yīng)的參數(shù)。

SELECT id, username, email, mobile, password, nickname, valid FROM user WHERE username LIKE ? and valid = ?
-- With parameters: ["%test%", true] 

所有支持的后綴詳見(jiàn)附錄I。

2. OR映射

OR語(yǔ)句也是SQL里一種常用的查詢方式,DoytoQuery支持的方式有兩種。

2.1 將含Or的字段映射為OR語(yǔ)句

usernameOrEmailOrMobile這樣多個(gè)字段由Or連接的字段會(huì)被映射為username = ? OR email = ? OR mobile = ?。

2.2 將實(shí)現(xiàn)了Or的對(duì)象映射為OR語(yǔ)句

public interface Or {
}
public class AccountOr implements Or {
    private String username;
    private String email;
    private String mobile;
}
public class UserQuery {
    private AccountOr account;
}

遍歷AccountOr中的字段可以得到[username, email, mobile],然后使用關(guān)鍵字OR相連而得username = ? OR email = ? OR mobile = ?.

3. 嵌套查詢映射

嵌套查詢是SQL的另一個(gè)常用特性。在管理菜單樹(shù)的menu表的常見(jiàn)定義中,我們通常定義一個(gè)外鍵parentId來(lái)引向父菜單實(shí)體的id。

要查詢擁有子菜單的父菜單,我們可以執(zhí)行以下SQL:

SELECT * FROM menu WHERE id IN (SELECT parentId FROM menu WHERE ...)

要查詢某些菜單的子菜單,我們可以執(zhí)行以下SQL:

SELECT * FROM menu WHERE parentId IN (SELECT id FROM menu WHERE ...)

這條語(yǔ)句用于查詢指定用戶擁有的菜單:

SELECT * FROM menu WHERE id IN (
    SELECT menu_id FROM a_perm_and_menu WHERE perm_id IN (
        SELECT perm_id FROM a_role_and_perm WHERE role_id IN (
            SELECT role_id FROM a_user_and_role WHERE user_id IN (
                SELECT id FROM t_user WHERE id = ?
))))

這些都是ERM模型里常見(jiàn)的一對(duì)多/多對(duì)一/多對(duì)多關(guān)系. DoytoQuery定義了一個(gè)新的@DomainPath注解來(lái)映射這種嵌套查詢。

@Target(FIELD)
@Retention(RUNTIME)
public @interface DomainPath {
    // To describe how to route from the host domain to the target domain.
    String[] value();
    String localField() default "id";
    String foreignField() default "id";
}

這里有一個(gè)@DomainPath注解用法介紹。

public class MenuQuery extends PageQuery {
    // 多對(duì)一: 根據(jù)父菜單的條件查詢他們的子菜單
    @DomainPath(localField = "parentId", foreignField = "id", value = "menu")
    MenuQuery parent;      // parentId   IN (SELECT      id   FROM     menu  WHERE ... )
    // 一對(duì)多: 根據(jù)子菜單的條件查詢父菜單
    @DomainPath(localField = "id", foreignField = "parentId", value = "menu")
    MenuQuery children;    // id   IN (SELECT      parentId   FROM     menu  WHERE ... )
    // 多對(duì)多: 查詢滿足條件的用戶被授予的菜單
    @DomainPath({"menu", "~", "perm",  "~", "role", "~", "user"})
    UserQuery user;
}

4. 直接映射

當(dāng)上述方法都不使用時(shí),還有最后一種將字段映射到條件的方法,就是使用注解@QueryField定義查詢條件后直接映射。這是DoytoQuery創(chuàng)建時(shí)的第一種映射方式,但是是最后一種推薦的方式,用法如下:

public class MenuQuery extends PageQuery {
    @QueryField(and = "id = (SELECT parent_id FROM menu WHERE id = ?)")
    private Integer childId;
}

嵌套查詢的這種映射方式在@DomainPath發(fā)明后就已棄用。

總結(jié)

在本文中,我們介紹了DoytoQuery中的四種字段映射方式。前三種方式不需要編寫(xiě)任何SQL語(yǔ)句,并且可以涵蓋到關(guān)系數(shù)據(jù)庫(kù)開(kāi)發(fā)中大部分涉及單表查詢的場(chǎng)景。

附錄I: 后綴支持列表

后綴名稱(chēng)比較符號(hào)占位符類(lèi)型值處理
(No matching
suffix)
=
Not!=?
NotLikeNOT LIKE?String%value%
LikeLIKE?String%value%
StartLIKE?String%value
EndLIKE?Stringvalue%
NotInNOT IN

非空集合: (?[, ?]);
空集合則忽略

Collection
InIN

非空集合(?[, ?]);
空集合: (null)

Collection
NotNullIS NOT NULL-boolean
NullIS NULL-boolean
Gt>?
Ge>=?
Lt<?
Le<=?
Eq=?

以上就是DoytoQuery中的查詢映射方案詳解的詳細(xì)內(nèi)容,更多關(guān)于DoytoQuery查詢映射的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳談Springfox與swagger的整合使用

    詳談Springfox與swagger的整合使用

    下面小編就為大家?guī)?lái)一篇詳談Springfox與swagger的整合使用。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • 使用EasyPOI實(shí)現(xiàn)多sheet動(dòng)態(tài)列導(dǎo)出

    使用EasyPOI實(shí)現(xiàn)多sheet動(dòng)態(tài)列導(dǎo)出

    這篇文章主要為大家詳細(xì)介紹了如何使用EasyPOI根據(jù)指定時(shí)間范圍創(chuàng)建動(dòng)態(tài)列,以及如何將數(shù)據(jù)組織成符合要求的格式并導(dǎo)出,感興趣的可以了解下
    2025-03-03
  • java?Collection集合接口的介紹和使用詳解

    java?Collection集合接口的介紹和使用詳解

    這篇文章主要為大家介紹了java?Collection集合接口的介紹和使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • java中File類(lèi)應(yīng)用遍歷文件夾下所有文件

    java中File類(lèi)應(yīng)用遍歷文件夾下所有文件

    這篇文章主要為大家詳細(xì)介紹了java中File類(lèi)應(yīng)用遍歷文件夾下所有文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • JAVA格式化時(shí)間日期的簡(jiǎn)單實(shí)例

    JAVA格式化時(shí)間日期的簡(jiǎn)單實(shí)例

    這篇文章主要介紹了JAVA格式化時(shí)間日期的簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下
    2013-11-11
  • java中如何使用泛型方法比較大小

    java中如何使用泛型方法比較大小

    這篇文章主要介紹了java中如何使用泛型方法比較大小,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 手把手教你如何利用SpringBoot實(shí)現(xiàn)審核功能

    手把手教你如何利用SpringBoot實(shí)現(xiàn)審核功能

    審核功能經(jīng)過(guò)幾個(gè)小時(shí)的奮戰(zhàn)終于完成了,現(xiàn)在我就與廣大網(wǎng)友分享我的成果,這篇文章主要給大家介紹了關(guān)于如何利用SpringBoot實(shí)現(xiàn)審核功能的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • SpringBoot使用minio及配置代碼

    SpringBoot使用minio及配置代碼

    MinIO是一個(gè)非常輕量的服務(wù),可以很簡(jiǎn)單的和其他應(yīng)用的結(jié)合,類(lèi)似?NodeJS,?Redis?或者?MySQL。本文重點(diǎn)給大家介紹SpringBoot使用minio及配置代碼,感興趣的朋友一起看看吧
    2022-02-02
  • 如何利用JAVA實(shí)現(xiàn)走迷宮程序

    如何利用JAVA實(shí)現(xiàn)走迷宮程序

    最近經(jīng)常在機(jī)房看同學(xué)在玩一個(gè)走迷宮的游戲,比較有趣,自己也用java實(shí)現(xiàn)了一個(gè),這篇文章主要給大家介紹了關(guān)于如何利用JAVA實(shí)現(xiàn)走迷宮程序的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • Java中的final關(guān)鍵字和抽象類(lèi)詳解

    Java中的final關(guān)鍵字和抽象類(lèi)詳解

    這篇文章主要介紹了Java中的final關(guān)鍵字和抽象類(lèi)詳解,當(dāng)不希望 類(lèi)被繼承時(shí),可以用final修飾比如不希望子類(lèi)重寫(xiě)父類(lèi)時(shí),當(dāng)不希望某個(gè)局部變量被修改時(shí),對(duì)參數(shù)進(jìn)行修飾,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

衡阳市| 镇坪县| 兖州市| 醴陵市| 平乐县| 丹东市| 四川省| 四平市| 桦南县| 大足县| 内江市| 岚皋县| 凤庆县| 宾川县| 罗甸县| 乌鲁木齐县| 巴林右旗| 鄱阳县| 临颍县| 庆云县| 鹤岗市| 乌拉特前旗| 松阳县| 河北省| 嘉黎县| 泸溪县| 栾川县| 南安市| 应用必备| 车致| 江川县| 广宁县| 康保县| 连州市| 手游| 五家渠市| 岐山县| 上犹县| 波密县| 图们市| 保靖县|