代码例子:
第一步:先获取EntityManager对象,获取该对象有两种方式
方式一:是可以直接使用**@PersistenceContext**注解,直接注入。(未测试,不知道成功性)
//方式一
@PersistenceContext
private EntityManager em;
//方式二
private static EntityManager entityManager = SpringContextUtil.getBean(EntityManager.class);
方式二:从spring 上下文获取 有时候需要在代码中直接获取spring bean,就可能通过这种方式。
SpringContextUtil的工具类如下:
@Component
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext context;
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.context = applicationContext;
}
/**
* 根据bean的name来获取bean
*
* @param beanName
* @return
*/
public static Object getBean(String beanName) {
return context.getBean(beanName);
}
/**
* 根据bean的类类型来获取bean
*
* @param beanName
* @return
*/
public static <T> T getBean(Class<T> clazz) {
return context.getBean(clazz);
}
/**
* 获取spring上下文
*
* @return
*/
public static ApplicationContext getContext() {
return context;
}
}
第二步:调用createNativeQuery,执行自己写的sql
public static Map queryPageMap(String tableName, String sqlWhere, String sqlOrder, String sqlPage, Class<?> tClass){
//第一步:使用StringBuffer封装拼接sql。queryList中是已经拼接好的sql。
StringBuffer queryList = new StringBuffer(" select * from "+tableName+" where 1=1 ");
StringBuffer queryCount = new StringBuffer(" select count(*) as count from "+tableName+" where 1=1 ");
if(!StringUtils.isEmpty(sqlWhere)){
queryList.append(sqlWhere);
queryCount.append(sqlWhere);
}
if(!StringUtils.isEmpty( sqlOrder)){
queryList.append(" order by "+sqlOrder);
}
if(!StringUtils.isEmpty(sqlPage)){
queryList.append(sqlPage);
}
//第二步:调用createNativeQuery执行sql。
Query query = entityManager.createNativeQuery(queryList.toString() , tClass);
Query query1 = entityManager.createNativeQuery(queryCount.toString());
List<?> list = query.getResultList();
DbEncryptUtil.decrypt(list);
Map<String, Object> map = new HashMap<>();
map.put("total", query1.getSingleResult());
map.put("dataList", list);
return map;
}
难点在于:createNativeQuery的传参:
在这里个例子中,第一个createNativeQuery(queryList.toString() , tClass);
tClass表示使用哪个类封装返回的查询结果信息。但当我们查询结果没有对应实体类时,query.getResultList()返回的是一个List<Object[]>,有的话就返回该实体的list集合
Query createNativeQuery(String var1, Class var2);
第二个,entityManager.createNativeQuery(queryCount.toString())
之所以使用getSingleResult,因为确认该sql只会返回一个值,就是count。但需要注意一下,这个方法当他查询不到结果时,将会抛出EntityNotFoundException异常,而不是返回null。
Query createNativeQuery(String var1);