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>类型
//可以用这个类型转换为你想转的实体,查看本人工具类那篇文章有提供工具类