EntityManager 学习

现在SpringBoot JPA 用List 就收都是需要泛型的,且数据都是单表的。所以要是多表的sql 类似于这样的List 带泛型的则不能接了,只有把泛型去了才可以,但是去泛型的sql早dao接口是不允许的,所以利用jdbcTemplate 和 EntityManager 这俩个来解决无泛型接收List的问题!!!

这个和jdbcTemplate 差不多都是操作sql的可以学习:

jdbcTemplate学习:
https://blog.csdn.net/weixin_41987908/article/details/102924663

声明:

@PersistenceContext
 private EntityManager entityManager;

首先简单介绍一下Entity生命周期中的Managed,Detached,Removed三种状态变化过程,如下图所示:
在这里插入图片描述

1: entityManager.createQuery(String hql) :查询语句
注意:是hql 语句   这个用的比较多!!!
2.entityManager.persist(Object entity);  新增数据;

如果entity的主键不为空,而数据库没有该主键,会抛出异常;

如果entity的主键不为空,而数据库有该主键,且entity的其他字段与数据库不同,persist后不会更新数据库;

3.entityManager.find(Class<T> entityClass, Object primaryKey);  根据主键查找数据;

如果主键格式不正确,会抛出illegalArgumentException异常;

如果主键在数据库未找到数据返回null;
4.entityManager.remove(Object entity);  删除数据;

只能将Managed状态的Entity实例删除,由此Entity实例状态变为Removed;
5.entityManager.merge(T entity);  

将 Detached状态的Entity实例转至Managed状态;
6.entityManager.clear();

将所有的Entity实例状态转至Detached状态;
7.entityManager.flush();

将所有Managed状态的Entity实例同步到数据库;
8.entityManager.refresh(Object entity);

加载Entity实例后,数据库该条数据被修改,refresh该实例,能得到数据库最新的修改,覆盖原来的Entity实例;

实际操作(如下只是一些还有很多方法):

createQuery(hql)

 String hql= "select s from SysUser s where s.displayName like '%test%' and s.dataRegion='ZB'";
 //hql可以 sql不行
 List<SysUser> resultList = entityManager.createQuery(hql).getResultList();

createNamedQuery(“finds”,SysUser.class)

//@NamedQuery 得放到实体类上面!!
@NamedQuery(name="finds",
        query="select s from SysUser s where s.displayName like :displayName and s.dataRegion = :dataRegion")
 String sql1 = "select u.* from epai_sys_dm.epai_sys_user u where" +
                "  u.domain = 'ZB' and u.display_name like '%test%'";

 Query findFullyPaidCruises = entityManager.createNamedQuery("finds",SysUser.class);
        findFullyPaidCruises.setParameter("displayName","test");
        //下面这样如果是删除的sql 则变为删除,修改sql则是修改   返回值为int
        findFullyPaidCruises.setParameter("dataRegion","ZB").executeUpdate();
        List <SysUser>resultList = findFullyPaidCruises.getResultList();

createNativeQuery

String sql1 = "select u.* from epai_sys_dm.epai_sys_user u where" +
                "  u.domain = 'ZB' and u.display_name like '%test%'";

//hql 不行,sql可以  一看native 应该是sql 数据特殊
 List<SysUser> resultList1 = entityManager.createNativeQuery(sql1).getResultList();
数据展示特殊(返回List<SysUser>list):
[
    [
        "6jprq460bt9z40jiwknt5nbm",
        "ORGAZB999999990",
        "",
        "zyrf_test1",
        "ZB",
        null,
        "",
        0,
        "zyrf_test1",
        "91b4d142823f7d20c5f08df69122de43f35f057a988d9619f6d3138485c9a203",
        null,
        1,
        null,
        null,
        "ZB",
        null,
        null,
        null,
        null,
        null
    ],
    [
        "sdjzkvwfns8vbajxo89s76c9",
        "ORGAZB999999990",
        "",
        "zyrf_test2",
        "ZB",
        null,
        "",
        0,
        "zyrf_test2",
        "91b4d142823f7d20c5f08df69122de43f35f057a988d9619f6d3138485c9a203",
        null,
        1,
        null,
        null,
        "ZB",
        null,
        null,
        null,
        null,
        null
    ]
]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值