现在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
]
]