JPA手写动态sql

1 篇文章 0 订阅
1 篇文章 0 订阅

JPA的EntityManage可以进行手写sql,不懂的EntityManage的自行百度搜索,下面只写本人涉及到的部分,会提供工具类,包含样例,一个比较简单的sql可以这么去拼写,复杂的还需自行去琢磨编写,这用法可用于视图(sql view)或者返回一些指定的BO(业务实体)

package com.yada.bill.util;

import org.springframework.util.CollectionUtils;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author hbx
 * @date 2022/6/24 2:35 PM
 */
public class QuerySQLUtils {

    /**
     * Get sql string.
     *
     * @param sql               the sql
     * @param requestParameters the request parameters
     * @return the string
     */
    public static String getSQL(String sql, LinkedHashMap<String, Object> requestParameters) {
        StringBuilder sbSQL = new StringBuilder(300);
        sbSQL.append(sql);
        if (!CollectionUtils.isEmpty(requestParameters)) {
            sbSQL.append("   WHERE   ");
            if (requestParameters.entrySet().size() > 1) {
                requestParameters.entrySet()
                        .stream()
                        .forEach(value -> {
                            appendSQL(sbSQL, value);
                            sbSQL.append(" AND ");
                        });
                return DataParseUtils.parseString(sbSQL.substring(0, sbSQL.lastIndexOf(" AND ") + 1));
            } else {
                requestParameters.entrySet()
                        .stream()
                        .forEach(value -> {
                            appendSQL(sbSQL, value);
                        });
            }
        }
        return DataParseUtils.parseString(sbSQL.toString());
    }

    private static void appendSQL(StringBuilder sbSQL, Map.Entry<String, Object> item) {
        String key = item.getKey();
        sbSQL.append(key);
        sbSQL.append(" = ");
        Object value = item.getValue();
        sbSQL.append("'" + value + "'");
    }

    public static void main(String[] args) {
        //第一种,可以放置参数
        LinkedHashMap<String, Object> requestParameters = new LinkedHashMap<>(2);
        requestParameters.put("TRANSACTION_DATE", "20211002");
        System.out.println(getSQL("select * from user ", requestParameters));
        //第二种不放置参数
        LinkedHashMap<String, Object> requestParameters = new LinkedHashMap<>(2);
        requestParameters.put("TRANSACTION_DATE", "20211002");
        System.out.println(getSQL("select * from user ", null));
    }

}

这个工具类是你要查询的数据,第一个参数是你的查询库表以及需要查询的字段,第二个参数是一个map,key为字段名,value为变量(第二参数map可为null)

 //注入entitymanage
 @PersistenceContext
 private EntityManager entityManager;

//用法
List resultList = entityManager.createNativeQuery(dataSql)
                .unwrap(NativeQueryImpl.class)
                .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP)
                .getResultList();
//dataSql = 上面那个工具类的返回值
//会返回一个没有泛型的List,这个List就是你在数据库查询的数据,默认是Map<String,Object>类型
//可以用这个类型转换为你想转的实体,查看本人工具类那篇文章有提供工具类

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值