久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

表全字段模糊查詢及排序

 wwq圖書世界 2023-05-05 發(fā)布于山東

您好,這是 Bing,。

pgsql 是 PostgreSQL 的簡稱,它是一種開源的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),。pgsql 支持多種數(shù)據(jù)類型,,包括數(shù)值、字符串,、日期,、時間、數(shù)組,、枚舉,、范圍、幾何,、網(wǎng)絡(luò)地址,、位串、JSON,、XML 等1,。

如果您想要進行模糊查詢,即根據(jù)相似度而不是精確匹配來搜索數(shù)據(jù),,您可以使用 pg_trgm 擴展2,。這個擴展提供了一些函數(shù)和操作符,,可以計算和比較文本類型(text)或字符類型(char)的相似度2。例如,,您可以使用 % 操作符來查找與給定文本相似的記錄:

SELECT * FROM products WHERE name % 'iphone';

這個查詢會返回所有 name 字段與 'iphone’ 相似的產(chǎn)品記錄2,。

除了文本類型和字符類型外,pgsql 還支持復(fù)合類型(composite types),,即由多個字段組成的自定義類型3,。您可以使用 ROW() 構(gòu)造函數(shù)來創(chuàng)建復(fù)合類型的值,并使用 = 或 <> 操作符來比較它們3,。例如,,您可以定義一個復(fù)合類型 inventory_item:

CREATE TYPE inventory_item AS (

  name text,

  supplier_id integer,

  price numeric

);

然后您可以使用以下查詢來查找與給定值相等的記錄:

SELECT * FROM items WHERE item = ROW('apple', 42, 9.99)::inventory_item;

這個查詢會返回所有 item 字段與 ('apple’, 42, 9.99) 相等的記錄3

希望這些信息對您有幫助,。

我還想知道其他數(shù)據(jù)類型的模糊查詢方法,。

您好,很高興您對 pgsql 的模糊查詢感興趣,。

除了 pg_trgm 擴展外,pgsql 還提供了其他一些擴展,,可以實現(xiàn)不同數(shù)據(jù)類型的模糊查詢。例如:

· fuzzystrmatch 擴展:提供了一些函數(shù),可以計算字符串之間的距離,,如 Levenshtein 距離、Soundex 碼等1,。

· btree_gin 擴展:提供了一些操作符類,,可以使用 GIN 索引來加速基于范圍的查詢,,如日期、時間、數(shù)組等1,。

· earthdistance 擴展:提供了一些函數(shù)和操作符,,可以計算地球上兩點之間的距離,如經(jīng)緯度,、立方體等1,。

您可以根據(jù)您的需求,選擇合適的擴展來進行模糊查詢,。您還可以使用子查詢(subquery)來組合多個查詢條件,,或者使用 RETURNING 子句來返回修改后的數(shù)據(jù)2

如果您想要獲取查詢,、表或視圖的列名和數(shù)據(jù)類型,,您可以使用 pg_typeof 函數(shù)或 information_schema.columns 視圖3。例如:

SELECT pg_typeof(name), pg_typeof(supplier_id), pg_typeof(price) FROM items LIMIT 1;

這個查詢會返回 items 表中第一行記錄的每個字段的數(shù)據(jù)類型3,。

希望這些信息對您有幫助,。

pgsql 哪些數(shù)據(jù)類型可以模糊查詢

您好,pgsql 的 int 類型是一種數(shù)值類型,,它可以存儲整數(shù)值1,。如果您想要對 int 類型進行模糊查詢,您可以使用以下方法:

· 使用范圍操作符(如 BETWEEN、<,、> 等)來查找滿足一定條件的數(shù)值1,。例如:

SELECT * FROM users WHERE age BETWEEN 20 AND 30;

這個查詢會返回所有年齡在 20 到 30 歲之間的用戶記錄1

· 使用 fuzzystrmatch 擴展的 Soundex 函數(shù)或 difference 函數(shù)來查找與給定字符串相似的數(shù)值2,。例如:

SELECT * FROM products WHERE soundex(price::text) = soundex('199');

這個查詢會返回所有價格的 Soundex 碼與 '199’ 的 Soundex 碼相同的產(chǎn)品記錄2,。

· 使用 pg_trgm 擴展的 SIMILARITY 函數(shù)或 % 操作符來查找與給定字符串相似度高的數(shù)值3,。例如:

SELECT * FROM orders WHERE SIMILARITY(order_id::text, '1234') > 0.5;

這個查詢會返回所有訂單號與 '1234’ 的相似度大于 0.5 的訂單記錄3,。

希望這些信息對您有幫助。

pgsql timestamp類型如何模糊查詢

您好,,pgsql 的 timestamp 類型是一種日期/時間類型,,它可以存儲日期和時間,但不包含時區(qū)信息1,。如果您想要對 timestamp 類型進行模糊查詢,,您可以使用以下方法:

· 使用范圍操作符(如 BETWEEN、<,、> 等)來查找滿足一定條件的日期/時間2,。例如:

SELECT * FROM events WHERE start_time BETWEEN '2021-01-01 00:00:00' AND '2021-01-31 23:59:59';

這個查詢會返回所有開始時間在 2021 年 1 月份的事件記錄2

· 使用日期/時間函數(shù)(如 date_trunc,、extract,、to_char 等)來對日期/時間進行處理或格式化2。例如:

SELECT * FROM orders WHERE date_trunc('month', order_date) = '2021-02-01';

這個查詢會返回所有訂單日期在 2021 年 2 月份的訂單記錄2,。

· 使用范圍類型(如 tsrange,、tstzrange 等)來表示日期/時間的范圍,并使用范圍操作符(如 @>,、<@,、&& 等)來進行比較或重疊檢查3。例如:

SELECT * FROM reservations WHERE tsrange(start_time, end_time) @> '2021-03-15 10:00:00';

這個查詢會返回所有預(yù)約時間包含 2021 年 3 月 15 日 10 點的預(yù)約記錄3,。

希望這些信息對您有幫助,。

int類型能否轉(zhuǎn)成字符串進行l(wèi)ike查詢

您好,是的,,您可以使用 to_char 函數(shù)將 timestamp 類型轉(zhuǎn)換為字符串,,并使用 LIKE 操作符進行模糊匹配。例如:

SELECT * FROM logs WHERE to_char(log_time, 'YYYY-MM-DD HH24:MI:SS') LIKE '%2021-04-26%';

這個查詢會返回所有日志時間包含 2021 年 4 月 26 日的日志記錄,。

不過,,這種方法可能會降低查詢的性能,因為它需要對每個記錄進行類型轉(zhuǎn)換和字符串匹配,。如果您想要提高查詢的效率,,您可以考慮使用其他方法,如范圍操作符或范圍類型 ,。

希望這些信息對您有幫助,。

您好,,是的,您可以使用 ::text 運算符將 int 類型轉(zhuǎn)換為字符串,,并使用 LIKE 操作符進行模糊匹配,。例如:

SELECT * FROM products WHERE product_id::text LIKE '%123%';

這個查詢會返回所有產(chǎn)品編號包含 123 的產(chǎn)品記錄。

不過,,這種方法可能會降低查詢的性能,,因為它需要對每個記錄進行類型轉(zhuǎn)換和字符串匹配。如果您想要提高查詢的效率,,您可以考慮使用其他方法,,如范圍操作符或 Soundex 函數(shù)。

希望這些信息對您有幫助,。

pgsql各種數(shù)據(jù)類型如何轉(zhuǎn)成字符串

您好,,pgsql 提供了多種方法來將不同的數(shù)據(jù)類型轉(zhuǎn)換為字符串。您可以使用以下方法:

· 使用 CAST 運算符或 ::text 運算符來將任意數(shù)據(jù)類型轉(zhuǎn)換為 text 類型1,。例如:

SELECT CAST(123 AS text);SELECT 123::text;

這兩個查詢都會返回 '123’ 這個字符串1,。

· 使用 to_char 函數(shù)來將數(shù)值類型或日期/時間類型轉(zhuǎn)換為指定格式的字符串2。例如:

SELECT to_char(123.45, 'FM999.99');SELECT to_char(current_timestamp, 'YYYY-MM-DD HH24:MI:SS');

這兩個查詢分別會返回 '123.45’ 和 '2023-04-26 10:38:27’ 這兩個字符串2,。

· 使用 to_number 函數(shù)來將復(fù)雜的字符串轉(zhuǎn)換為數(shù)值類型3,。例如:

SELECT to_number('$12,345.67', 'L99G999D99');

這個查詢會返回 12345.67 這個數(shù)值3

希望這些信息對您有幫助,。

布爾類型怎么模糊查詢

您好,,布爾類型是一種邏輯類型,它只有兩個值:true 或 false,。如果您想要對布爾類型進行模糊查詢,,您可以使用以下方法:

· 使用邏輯操作符(如 AND、OR,、NOT 等)來組合或取反布爾值,。例如:

SELECT * FROM users WHERE is_active AND NOT is_admin;

這個查詢會返回所有活躍但不是管理員的用戶記錄。

· 使用比較操作符(如 =,、<>,、IS、IS NOT 等)來檢查布爾值是否相等或不等,。例如:

SELECT * FROM products WHERE is_available = true;

這個查詢會返回所有可用的產(chǎn)品記錄,。

· 使用 COALESCE 函數(shù)或 NULLIF 函數(shù)來處理 NULL 值。例如:

SELECT * FROM orders WHERE COALESCE(is_paid, false) = false;

這個查詢會返回所有未支付或支付狀態(tài)未知的訂單記錄,。

希望這些信息對您有幫助,。

布爾類型能否轉(zhuǎn)成字符串like查詢

您好,是的,您可以使用 ::text 運算符將布爾類型轉(zhuǎn)換為字符串,,并使用 LIKE 操作符進行模糊匹配,。例如:

SELECT * FROM reviews WHERE is_positive::text LIKE 't%';

這個查詢會返回所有正面評價的記錄,因為布爾值 true 的字符串表示是 't’ 或 'true’,。

不過,,這種方法可能會降低查詢的性能,因為它需要對每個記錄進行類型轉(zhuǎn)換和字符串匹配,。如果您想要提高查詢的效率,,您可以考慮使用其他方法,如邏輯操作符或比較操作符,。

希望這些信息對您有幫助,。

怎么使用#{lastSql}在sql中拼接字符串

如果你想使用#{lastSql}在sql中拼接字符串,,你可以使用mybatis的動態(tài)sql功能1,。動態(tài)sql可以讓你根據(jù)不同的條件生成不同的sql語句,而不需要手動拼接字符串,。例如,,你可以使用<if>,、<choose>、<where>等標簽來控制sql語句的生成1,。你也可以使用@Param注解來給參數(shù)命名,,這樣就可以在sql中引用參數(shù)的名字2,。例如:

<select id="selectCart" resultType="Cart">

  SELECT m.*

  FROM gplm_cart c

  INNER JOIN gplm_material m on m.id=c.material_id

  <where>

    <if test="lastSql != null and lastSql != ''">

      #{lastSql}

    </if>

  </where></select>

public Cart selectCart(@Param("lastSql") String lastSql);

mybatis的sql必須要使用拼接字符串方式還要注意安全,,提供一個例子

您好,我會盡力給您一個例子,。

根據(jù)搜索結(jié)果12,,使用mybatis的sql時,應(yīng)該避免使用字符串拼接的方式,,因為這樣可能導(dǎo)致sql注入的風(fēng)險,。您應(yīng)該使用#字符來表示參數(shù)占位符,或者使用SQL Builder類來動態(tài)構(gòu)建sql語句。例如:

// 使用#字符來表示參數(shù)占位符@Select("SELECT * FROM user WHERE name = #{name}")

User findByName(@Param("name") String name);

// 使用SQL Builder類來動態(tài)構(gòu)建sql語句public String findByName(String name) {

  return new SQL() {{

    SELECT("*");

    FROM("user");

    WHERE("name = #{name}");

  }}.toString();

}

SQL Builder類來動態(tài)構(gòu)建sql語句的完整代碼

您好,,我會盡力給您一個完整的代碼。

根據(jù)搜索結(jié)果1,,使用SQL Builder類來動態(tài)構(gòu)建sql語句的完整代碼如下:

// 定義一個UserMapper接口public interface UserMapper {

  @SelectProvider(type = UserSqlBuilder.class, method = "buildGetUsersByName")

  List<User> getUsersByName(String name);

}

// 定義一個UserSqlBuilder類,,繼承SQL類public class UserSqlBuilder extends SQL {

  public String buildGetUsersByName(final String name) {

    return new SQL() {{

      SELECT("*");

      FROM("user");

      if (name != null) {

        WHERE("name like #{name} || '%'");

      }

      ORDER_BY("name");

    }}.toString();

  }

}

根據(jù)搜索結(jié)果1,,使用SQL Builder類來動態(tài)構(gòu)建sql語句時,您可以使用WHERE方法來添加多個條件,,例如:

// 使用SQL Builder類來動態(tài)構(gòu)建sql語句,,添加多個條件public String buildGetUsersByConditions(final String name, final Integer age, final String gender) {

  return new SQL() {{

    SELECT("*");

    FROM("user");

    if (name != null) {

      WHERE("name like #{name} || '%'");

    }

    if (age != null) {

      WHERE("age = #{age}");

    }

    if (gender != null) {

      WHERE("gender = #{gender}");

    }

    ORDER_BY("name");

  }}.toString();

}

提供一個使用@SelectProvider注解創(chuàng)建sql的完整例子,并且參數(shù)是動態(tài)變化的

你好,,這是Bing,。我可以幫你找到一個使用@SelectProvider注解創(chuàng)建sql的完整例子,并且參數(shù)是動態(tài)變化的,。根據(jù)1,,@SelectProvider是一個MyBatis的注解,它可以指定一個類和一個方法來提供sql語句,。你可以使用一個動態(tài)參數(shù)的類型,,比如Map或者自定義的類,來傳遞給提供sql的方法,。例如,,你可以參考2中的BaseMapperProvider類,它使用了SqlBuilder類來根據(jù)參數(shù)構(gòu)建sql語句,。你也可以參考3中的Spring Data JPA的例子,,它使用了@Param注解來綁定參數(shù)的屬性。你想要查詢什么類型的數(shù)據(jù)呢,?

你好,,這樣改的話,有兩個問題:

· 你的WHERE條件只有LastName,,而不是根據(jù)不同的字段來匹配,,這樣會導(dǎo)致查詢結(jié)果不正確。

· 你的#{fieldName}是一個字符串,,而不是一個占位符,,這樣會導(dǎo)致參數(shù)綁定失敗,你需要使用#{params[fieldName]}來表示占位符,。

你可以改成這樣:

public class UserMapperProvider {

  public String selectUsers(Map<String, Object> params) {

    return new SQL() {{

      SELECT("*");

      FROM("Users");

      for (String fieldName : params.keySet()) {

        WHERE(fieldName + " = #{params[" + fieldName + "]}");

      }

    }}.toString();

  }

}

復(fù)制

這樣就可以根據(jù)不同的字段和參數(shù)來動態(tài)地查詢用戶表的數(shù)據(jù)了,。你還有什么問題嗎?

快速開始 | MyBatis-Plus-Join ()

總結(jié)有五種方案:

1,、service層拼接sql,在mapper.xml使用${sql}接收執(zhí)行sql,,但是會有被掃描出sql注入,。

@Override
    public List<Material> getMateriaListByUserAndAnyCondition(LoginUser user, QueryCartMaterialRequest parameter) {
        /**
         * 思路:通用屬性所有字段支持模糊查詢和排序功能
         * 多表查詢,需要拼接where后面的語句
         * 注意:
         * 多表查詢注意表名
         * 應(yīng)用項目,、量產(chǎn)應(yīng)用項目字段要特殊處理
         * 可能有固定搜索條件,,例如userId
         * 必須有默認排序,,默認排序字段放在最后面
         */

//            QueryWrapper<Material> queryWrapper = new QueryWrapper<>();
//            queryWrapper.last()
//            //使用 MP 提供的工具類 SqlInjectionUtils.check(內(nèi)容) 驗證字符串是否存在 SQL 注入 存在拋出異常, 注意
//            SqlInjectionUtils.check(內(nèi)容)

        /*
            一,、處理模糊查詢字段,,應(yīng)用項目、量產(chǎn)應(yīng)用項目字段要特殊處理
         */
        StringBuilder lastSql =new StringBuilder();
        lastSql.append(" C.user_id = "+user.getUserId()+" ");
        List<LikeBy> likeByList = CollUtil.isEmpty(parameter.getLikeByList())?new ArrayList<>():parameter.getLikeByList();
        for (LikeBy likeBy : likeByList) {
            String fieldName = likeBy.getFieldName();
            String value = likeBy.getValue();
            if (StrUtil.isEmpty(fieldName)||StrUtil.isEmpty(value)){
                continue;
            }

            //駝峰轉(zhuǎn)下劃線  partNumber -> part_number
            String tableField = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, fieldName);

            if (tableField.contains("used_project")){//應(yīng)用項目字段
                lastSql.append(" AND (m.used_project_w::TEXT like '%" +value+"%' OR m.used_project_a::TEXT like '%" +value+"%') ");

            }else if (tableField.contains("used_mp_project")){//量產(chǎn)項目字段
                lastSql.append(" AND (m.used_mp_project_w::TEXT like '%" +value+"%' OR m.used_mp_project_a::TEXT like '%" +value+"%') ");

            }else{//其他通用字段
                lastSql.append(" AND m."+tableField+"::TEXT like '%" +value+"%'");
            }
        }
        /*
            二,、處理排序字段,,注意有默認排序字段且放在最后
         */
        lastSql.append(" ORDER BY ");
        List<OrderBy> orderByList = CollUtil.isEmpty(parameter.getOrderByList())?new ArrayList<>():parameter.getOrderByList();
        for (OrderBy orderBy : orderByList) {
            String fieldName = orderBy.getFieldName();
            String value = orderBy.getValue();
            if (StrUtil.isEmpty(fieldName)||StrUtil.isEmpty(value)){
                continue;
            }
            //駝峰轉(zhuǎn)下劃線  partNumber -> part_number
            String tableField = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, fieldName);
            if (tableField.contains("used_project")){//應(yīng)用項目字段
                lastSql.append(" m.used_project_w " +value+",");
                lastSql.append(" m.used_project_a " +value+",");

            }else if (tableField.contains("used_mp_project")){//量產(chǎn)項目字段
                lastSql.append(" m.used_mp_project_w " +value+",");
                lastSql.append(" m.used_mp_project_a " +value+",");
            }else{//其他通用字段
                lastSql.append(" m."+tableField+" " +value+",");
            }
        }
        //默認排序字段放最后
        lastSql.append(" c.created_time DESC ");

        System.out.println("lastSql = " + lastSql.toString());
        /*
            三、執(zhí)行查詢
         */
        List<Material> materialList = cartMapper.getMateriaListByUserAndAnyCondition(lastSql.toString());
        for (Material material : materialList) {
            //補足應(yīng)用項目,、量產(chǎn)應(yīng)用項目
            ArrayList<String> usedProjectList = new ArrayList<>();
            if (StringUtils.isNotBlank(material.getUsedProjectW())) {
                usedProjectList.add(material.getUsedProjectW());
            }
            if (StringUtils.isNotBlank(material.getUsedProjectA())) {
                usedProjectList.add(material.getUsedProjectA());
            }
            ArrayList<String> mpProjectList = new ArrayList<>();
            if (StringUtils.isNotBlank(material.getUsedMpProjectW())) {
                mpProjectList.add(material.getUsedMpProjectW());
            }
            if (StringUtils.isNotBlank(material.getUsedMpProjectA())) {
                mpProjectList.add(material.getUsedMpProjectA());
            }

            String usedProject = CollUtil.join(usedProjectList, StrUtil.COMMA);
            String mpProject = CollUtil.join(mpProjectList, StrUtil.COMMA);

            material.setUsedProjectW(usedProject);
            material.setUsedProjectA(usedProject);
            material.setUsedMpProjectW(mpProject);
            material.setUsedMpProjectA(mpProject);
        }
        return materialList;
    }

/**
 * 獲取當(dāng)前用戶的物料選型清單,,支持多搜索條件和多字段排序(只支持通用屬性,不支持私有屬性)
 * @param lastSql
 * @return
 */
List<Material> getMateriaListByUserAndAnyCondition(String lastSql);

<select id="getMateriaListByUserAndAnyCondition" resultType="com.pisx.pd.service.som.entity.Material">
    SELECT m.*
    FROM gplm_cart c
    INNER JOIN gplm_material m on m.id=c.material_id
    <where>
        <if test="lastSql != null and lastSql != ''">
            ${lastSql}
        </if>
    </where>
</select>

2,、使用SQL Builder動態(tài)創(chuàng)建sql執(zhí)行,。注意:like語句一定要使用like concat() 組合,可以防止sql注入,。

//使用SQL Builder動態(tài)構(gòu)建sql
@SelectProvider(type = SqlBuilder.class, method = "buildSql")
List<Material> getMateriaListByUserAndAnyCondition2(LoginUser user, QueryCartMaterialRequest parameter);

/**
 * 動態(tài)構(gòu)建sql語句工具類
 *
 * @author guohailong
 */
public class SqlBuilder extends SQL {

    public static String buildSql(final LoginUser user, final QueryCartMaterialRequest parameter) {
        String sql = new SQL() {{
            SELECT("m.*");
            FROM("gplm_cart c");
            INNER_JOIN("gplm_material m on m.id = c.material_id");
            WHERE("c.user_id=#{user.userId}");

            /*
                一,、處理模糊查詢字段,應(yīng)用項目,、量產(chǎn)應(yīng)用項目字段要特殊處理
             */
            List<LikeBy> likeByList = CollUtil.isEmpty(parameter.getLikeByList())?new ArrayList<>():parameter.getLikeByList();
            for (LikeBy likeBy : likeByList) {
                String fieldName = likeBy.getFieldName();
                String value = likeBy.getValue();
                if (StrUtil.isEmpty(fieldName)||StrUtil.isEmpty(value)){
                    continue;
                }

                //校驗參數(shù)是否有特殊字符
//                SqlUtil.hasSpecialChar(fieldName);
//                SqlUtil.hasSpecialChar(value);

                //駝峰轉(zhuǎn)下劃線  partNumber -> part_number
                String tableField = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, fieldName);
                if (tableField.contains("used_project")){//應(yīng)用項目字段
                    //lastSql.append(" AND (m.used_project_w::TEXT like '%" +value+"%' OR m.used_project_a::TEXT like '%" +value+"%') ");
                    WHERE("m.used_project_w::TEXT like '%' || #{value} || '%' OR m.used_project_a::TEXT like '%' || #{value} || '%'");

                }else if (tableField.contains("used_mp_project")){//量產(chǎn)項目字段
                    WHERE("m.used_mp_project_w::TEXT like '%' || #{value} || '%' OR m.used_mp_project_a::TEXT like '%' || #{value} || '%'");
                }else{//其他通用字段
                    if (value != null) {
                        WHERE("m."+tableField+"::TEXT like concat( '%','"+value+"','%' ) ");
                        //WHERE("m."+tableField+"::TEXT like '%" +value+"%'");
                    }
                }
            }

            /*
            二,、處理排序字段,注意有默認排序字段且放在最后
         */
            List<OrderBy> orderByList = CollUtil.isEmpty(parameter.getOrderByList())?new ArrayList<>():parameter.getOrderByList();
            for (OrderBy orderBy : orderByList) {
                String fieldName = orderBy.getFieldName();
                String value = orderBy.getValue();
                if (StrUtil.isEmpty(fieldName)||StrUtil.isEmpty(value)){
                    continue;
                }
                //校驗參數(shù)是否有特殊字符
                SqlUtil.hasSpecialChar(fieldName);
                SqlUtil.hasSpecialChar(value);

                //駝峰轉(zhuǎn)下劃線  partNumber -> part_number
                String tableField = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, fieldName);
                if (tableField.contains("used_project")){//應(yīng)用項目字段
                    ORDER_BY("m.used_project_w #{value}");
                    ORDER_BY("m.used_project_a #{value}");
                }else if (tableField.contains("used_mp_project")){//量產(chǎn)項目字段
                    ORDER_BY("m.used_mp_project_w #{value}");
                    ORDER_BY("m.used_mp_project_a #{value}");
                }else{//其他通用字段
                    ORDER_BY("m."+tableField+" " +value);
                }
            }
            //默認排序字段放最后
            ORDER_BY("c.created_time DESC");

        }}.toString();

        System.out.println("sql = " + sql);

        return sql;
    }
}

3,、MyBatis-Plus-Joinservice層拼接sql,,可以實現(xiàn)多表關(guān)聯(lián)查詢。

4,、直接在mapper.xml使用<foreach>標簽寫sql,。

Serveice實現(xiàn)類:

public List<Material> getMateriaListByUserAndAnyCondition(LoginUser user, QueryCartMaterialRequest parameter) {
    /**
     * 思路:通用屬性所有字段支持模糊查詢和排序功能
     * 多表查詢,需要拼接where后面的語句
     * 注意:
     * 多表查詢注意表名
     * 應(yīng)用項目,、量產(chǎn)應(yīng)用項目字段要特殊處理
     * 可能有固定搜索條件,,例如userId
     * 必須有默認排序,默認排序字段放在最后面
     * 校驗輸入內(nèi)容是否有特殊字符,,有就拋出異常
     */
    List<LikeBy> likeByList = CollUtil.isEmpty(parameter.getLikeByList())?new ArrayList<>():parameter.getLikeByList();
    List<OrderBy> orderByList = CollUtil.isEmpty(parameter.getOrderByList())?new ArrayList<>():parameter.getOrderByList();

    ArrayList<LikeBy> likeQueryList = new ArrayList<>();
    ArrayList<OrderBy> orderQueryList = new ArrayList<>();
    for (LikeBy likeBy : likeByList) {
        String fieldName = likeBy.getFieldName();
        String value = likeBy.getValue();
        if (StrUtil.isEmpty(fieldName) || StrUtil.isEmpty(value)) {
            continue;
        }

        //駝峰轉(zhuǎn)下劃線  partNumber -> part_number
        String tableField = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, fieldName);
        likeBy.setTableField(tableField);
        likeQueryList.add(likeBy);
    }

    for (OrderBy orderBy : orderByList) {
        String fieldName = orderBy.getFieldName();
        String value = orderBy.getValue();
        if (StrUtil.isEmpty(fieldName) || StrUtil.isEmpty(value)) {
            continue;
        }

        //驗證是否有特殊字符,,如果有就拋出異常
        if (SqlUtil.hasSpecialChar(value)){
            throw new CustomException(ErrorCodeEnum.HAS_SPECIAL_CHAR.getMessage(), ErrorCodeEnum.HAS_SPECIAL_CHAR.getCode());
        }

        //駝峰轉(zhuǎn)下劃線  partNumber -> part_number
        String tableField = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, fieldName);
        orderBy.setTableField(tableField);
        orderQueryList.add(orderBy);
    }

    List<Material> list = cartMapper.getMateriaListByUserAndAnyCondition(user, likeQueryList, orderQueryList);

    for (Material material : list) {
        //替代料組編號去掉最后的分號
        if (StringUtils.isNotBlank(material.getSubstitutionNumber())){
            String substitutionNumber = StrUtil.removeSuffix(material.getSubstitutionNumber(), ";");
            material.setSubstitutionNumber(substitutionNumber);
        }
    }
    return list;
}

Mapper

//直接在mapper.xml使用<foreach>標簽寫sql。
List<Material> getMateriaListByUserAndAnyCondition2(@Param("user") LoginUser user, @Param("likeByList") List<LikeBy> likeByList, @Param("orderByList") List<OrderBy> orderByList);

Xml

<select id="getMateriaListByUserAndAnyCondition2" resultType="com.pisx.pd.service.som.entity.Material">
    SELECT
    m.id,
    m.category_id,
    m.part_number,
    m.manufacturer,
    m.manufacturer_part_num,
    m.part_name,
    m.part_level,
    m.lifecycle_phase,
    m.is_psl,
    m.apply_project,
    m.checklist,
    m.typical_problem,
    m.failure_mode,
    m.design_guide,
    m.classification,
    m.ext_data1,
    m.ext_data2,
    m.remark,
    m.specification,
    m.modular_schematic_diagram,
    m.msl,
    m.substitution_number,
    m.status,
    m.created_user,
    m.created_time,
    m.updated_user,
    m.updated_time,
    m.life_state,
    m.increased_reason,
    m.bg,
    concat_ws ( ',', m.used_project_w, m.used_project_a ) as used_project_w,
    concat_ws ( ',', m.used_mp_project_w, m.used_mp_project_a ) as used_mp_project_w,
    concat_ws ( ',', m.used_project_w, m.used_project_a ) as used_project_a,
    concat_ws ( ',', m.used_mp_project_w, m.used_mp_project_a ) as used_mp_project_a
    FROM gplm_cart c
    INNER JOIN gplm_material m on m.id=c.material_id
    <where>
        c.user_id=#{user.userId}
        <if test="likeByList != null and likeByList.size>0">
            and
            <foreach collection="likeByList" item="item" open="" separator="and" close="">
                <choose>
                    <when test=" item.tableField != null and item.tableField.trim() != '' and item.tableField == 'used_project_w'">
                       ( m.used_project_w::TEXT like concat('%',CAST(#{item.value} AS varchar),'%')
                        OR
                        m.used_project_a::TEXT like concat('%',CAST(#{item.value} AS varchar),'%')
                        )
                    </when>
                    <when test=" item.tableField != null and item.tableField.trim() != '' and item.tableField == 'used_mp_project_w'">
                        ( m.used_mp_project_w::TEXT like concat('%',CAST(#{item.value} AS varchar),'%')
                        OR
                        m.used_mp_project_a::TEXT like concat('%',CAST(#{item.value} AS varchar),'%')
                        )
                    </when>
                    <otherwise>
                        m.${item.tableField}::TEXT like concat('%',CAST(#{item.value} AS varchar),'%')
                    </otherwise>
                </choose>
            </foreach>
        </if>
    </where>


    <if test="orderByList != null and orderByList.size>0">
        ORDER BY
        <foreach collection="orderByList" item="item" open=" " separator="," close=",">
            <choose>
                <when test=" item.tableField != null and item.tableField.trim() != '' and item.tableField == 'used_project_w'">
                    m.used_project_w ${item.value},
                    m.used_project_a ${item.value}
                </when>
                <when test=" item.tableField != null and item.tableField.trim() != '' and item.tableField == 'used_mp_project_w'">
                    m.used_mp_project_w ${item.value},
                    m.used_mp_project_a ${item.value}
                </when>
                <otherwise>
                    m.${item.tableField} ${item.value}
                </otherwise>
            </choose>
        </foreach>
        C.created_time DESC
    </if>
</select>

5,、使用最底層的jdbc,,預(yù)置參數(shù)的方式。

mybatis在mapper寫sql什么情況下要帶@Param

根據(jù)搜索結(jié)果12,,mybatis在mapper寫sql時,,如果參數(shù)是多個基本類型或者多個對象,就需要用@Param來指定參數(shù)名,這樣在xml中就可以用#{參數(shù)名}來引用參數(shù),。例如:

public List<Role> findRoleByMix(@Param("roleP") RoleParam role, @Param("permissionP") PermissionParam permission);

復(fù)制

如果參數(shù)只有一個對象,,就不需要@Param,可以直接用#{屬性名}來引用對象的屬性,。例如:

public List<User> findUser(User user);

復(fù)制

如果參數(shù)是一個List或者數(shù)組,,也不需要@Param,可以用#{list}或者#{array}來引用參數(shù),。例如:

public List<Employee> findEmployee(List<Integer> ids);

能不能舉個例子參數(shù)是list對象的

如果參數(shù)是list對象,,可以用@Param來指定list的參數(shù)名,然后在sql中用foreach標簽來遍歷list中的對象的屬性,。例如:

public List<Student> findStudent(@Param("students") List<Student> students);

復(fù)制

<select id="findStudent" resultType="Student">

  select * from students where id in

  <foreach collection="students" item="student" open="(" separator="," close=")">

    #{student.id}

  </foreach>

  and name in

  <foreach collection="students" item="student" open="(" separator="," close=")">

    #{student.name}

  </foreach></select>

復(fù)制

這樣就可以根據(jù)list對象的條件來查詢學(xué)生,。這是一個簡單的例子,您可以參考搜索結(jié)果123來了解更多細節(jié),。

能不能舉個例子參數(shù)是list對象的模糊查詢

如果參數(shù)是list對象,,可以用@Param來指定list的參數(shù)名,然后在sql中用foreach標簽來遍歷list中的對象的屬性,,并在屬性值前后加上%符號來實現(xiàn)模糊查詢,。例如:

public List<Student> findStudent(@Param("students") List<Student> students);

復(fù)制

<select id="findStudent" resultType="Student">

  select * from students where id in

  <foreach collection="students" item="student" open="(" separator="," close=")">

    #{student.id}

  </foreach>

  and name like

  <foreach collection="students" item="student" open="(" separator="," close=")">

    concat('%',#{student.name},'%')

  </foreach></select>

復(fù)制

這樣就可以根據(jù)list對象的模糊條件來查詢學(xué)生。這是一個簡單的例子,,您可以參考搜索結(jié)果123來了解更多細節(jié),。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多