使用JPA原生sql对单表进行操作

代码例子:

第一步:先获取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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值