您好,這是 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ù)了,。你還有什么問題嗎? 總結(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-Join在service層拼接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é),。
|