EntityManager 是用来对实体Bean 进行操作的辅助类。他可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,也可以通过EJB3 QL 语言查找满足条件的实体Bean。实体Bean 被EntityManager 管理时,EntityManager跟踪他的状态改变,在任何决定更新实体Bean 的时候便会把发生改变的值同步到数据库中。当实体Bean 从EntityManager 分离后,他是不受管理的,EntityManager 无法跟踪他的任何状态改变。EntityManager 的获取前面已经介绍过,可以通过@PersistenceContext 注释由EJB 容器动态注入。

  Entitymanager的核心概念图

          


EntityManager构建通用DAO


一般的开发都是需要每一个实体类都要构建一个DAO去继承JPA的一些类,我不咋喜欢这样的感觉,我比较喜欢一个项目中简洁不乱,所有偷懒的写了一个四不像的通用DAO

1、首先可以去官网看一下,了解一下entitymanager的一些方法

  • persist() :添加实体Bean
  • flush() :将实体的改变立刻刷新到数据库中
  • merge () :比较麻烦,用好了很不错,配合flush
  • Remove() :删除对象
  • createQuery() :返回Query对象,以执行JPQL语句
  • createNativeQuery() :返回Query对象,以执行SQL语句
  • refresh() :刷新实体Bean,以得到对新对象
  • contains(): 检测实体当前是否被管理中
  • clear() 分离所有当前正在被管理的实体

2、用@PersistenceContext动态注入Entitymanager

先来一个BaseDAO

public interface BaseAppDAO<T,ID extends Serializable> {
/**
* 保存数据对象
* @param entity
* @return
*/
boolean save(T entity);
/**
* 根据id查询
* @param id
* @param t
* @return
*/
T findByid(T t,Long id);
/**
* 根据表名,字段,参数查询,拼接sql语句
* @param tablename 表名
* @param filed 字段名
* @param o 字段参数
* @return
*/
List<T> findBysql(String tablename,String filed,Object o);
Object findObjiectBysql(String tablename,String filed,Object o); /**
* 多个字段的查询
* @param tablename 表名
* @param map 将你的字段传入map中
* @return
*/
List<T> findByMoreFiled(String tablename,LinkedHashMap<String,Object> map); /**
* 多字段查询分页
* @param tablename 表名
* @param map 以map存储key,value
* @param start 第几页
* @param pageNumer 一个页面的条数
* @return
*/
List<T> findByMoreFiledpages(String tablename, LinkedHashMap<String,Object> map, int start, int pageNumer);
/**
* 一个字段的分页
* @param tablename 表名
* @param filed 字段名
* @param o 字段参数
* @param start 第几页
* @param pageNumer 一个页面多少条数据
* @return
*/
List<T> findpages(String tablename,String filed,Object o,int start,int pageNumer);
/**
* 根据表的id删除数据
* @param entity
*/
boolean delete(T entity);
/**
* 更新对象
* @param e
* @return
*/
boolean update(T e);
/**
* 根据传入的map遍历key,value拼接字符串,以id为条件更新
* @param tablename 表名
* @param map 传入参数放入map中
* @return
*/
Integer updateMoreFiled(String tablename,LinkedHashMap<String,Object> map); /**
* 根据条件查询总条数返回object类型
* @param tablename 表名
* @param map 传入参数放入map中
* @return
*/
Object findCount(String tablename, LinkedHashMap<String,Object> map);
}

再写一个实现类BaseDAOimpl,其中注意的是@Transactional事务的注入

/**
* @author 坚持到底gl
* @create 2017-09-26 10:36
* @desc
**/
@Repository
public class BaseAppDAOimpl<T,ID extends Serializable> implements BaseAppDAO<T,ID> { @PersistenceContext
private EntityManager entityManager;
@Transactional
@Override
public boolean save(T entity){
boolean flag=false;
try {
entityManager.persist(entity);
flag=true;
}catch (Exception e){
System.out.println("---------------保存出错---------------");
throw e;
}
return flag;
}
@Transactional
@Override
public Object findByid(Object o,Long id) {
return entityManager.find(o.getClass(),id);
}
@Transactional
@Override
public List<T> findBysql(String tablename, String filed, Object o ) {
String sql="from "+tablename+" u WHERE u."+filed+"=?";
System.out.println(sql+"--------sql语句-------------");
Query query=entityManager.createQuery(sql);
query.setParameter(1,o);
List<T> list= query.getResultList();
entityManager.close();
return list;
} @Override
public Object findObjiectBysql(String tablename, String filed, Object o) {
String sql="from "+tablename+" u WHERE u."+filed+"=?";
System.out.println(sql+"--------sql语句-------------");
Query query=entityManager.createQuery(sql);
query.setParameter(1,o); entityManager.close();
return query.getSingleResult();
}
@Transactional
@Override
public List<T> findByMoreFiled(String tablename,LinkedHashMap<String,Object> map) {
String sql="from "+tablename+" u WHERE ";
Set<String> set=null;
set=map.keySet();
List<String> list=new ArrayList<>(set);
List<Object> filedlist=new ArrayList<>();
for (String filed:list){
sql+="u."+filed+"=? and ";
filedlist.add(filed);
}
sql=sql.substring(0,sql.length()-4);
System.out.println(sql+"--------sql语句-------------");
Query query=entityManager.createQuery(sql);
for (int i=0;i<filedlist.size();i++){
query.setParameter(i+1,map.get(filedlist.get(i)));
}
List<T> listRe= query.getResultList();
entityManager.close();
return listRe;
}
@Transactional
@Override
public List<T> findByMoreFiledpages(String tablename,LinkedHashMap<String,Object> map,int start,int pageNumber) {
String sql="from "+tablename+" u WHERE ";
Set<String> set=null;
set=map.keySet();
List<String> list=new ArrayList<>(set);
List<Object> filedlist=new ArrayList<>();
for (String filed:list){
sql+="u."+filed+"=? and ";
filedlist.add(filed);
}
sql=sql.substring(0,sql.length()-4);
System.out.println(sql+"--------sql语句-------------");
Query query=entityManager.createQuery(sql);
for (int i=0;i<filedlist.size();i++){
query.setParameter(i+1,map.get(filedlist.get(i)));
}
query.setFirstResult((start-1)*pageNumber);
query.setMaxResults(pageNumber);
List<T> listRe= query.getResultList();
entityManager.close();
return listRe;
}
@Transactional
@Override
public List<T> findpages(String tablename, String filed, Object o, int start, int pageNumer) {
String sql="from "+tablename+" u WHERE u."+filed+"=?";
System.out.println(sql+"--------page--sql语句-------------");
List<T> list=new ArrayList<>();
try {
Query query=entityManager.createQuery(sql);
query.setParameter(1,o);
query.setFirstResult((start-1)*pageNumer);
query.setMaxResults(pageNumer);
list= query.getResultList();
entityManager.close();
}catch (Exception e){
System.out.println("------------分页错误---------------");
} return list;
}
@Transactional
@Override
public boolean update(T entity) {
boolean flag = false;
try {
entityManager.merge(entity);
flag = true;
} catch (Exception e) {
System.out.println("---------------更新出错---------------");
}
return flag;
}
@Transactional
@Override
public Integer updateMoreFiled(String tablename, LinkedHashMap<String, Object> map) {
String sql="UPDATE "+tablename+" AS u SET ";
Set<String> set=null;
set=map.keySet();
List<String> list=new ArrayList<>(set);
for (int i=0;i<list.size()-1;i++){
if (map.get(list.get(i)).getClass().getTypeName()=="java.lang.String"){
System.out.println("-*****"+map.get(list.get(i))+"------------"+list.get(i));
sql+="u."+list.get(i)+"='"+map.get(list.get(i))+"' , ";
}else {
sql+="u."+list.get(i)+"="+map.get(list.get(i))+" , ";
}
}
sql=sql.substring(0,sql.length()-2);
sql+="where u.id=? ";
System.out.println(sql+"--------sql语句-------------");
int resurlt=0;
try {
Query query=entityManager.createQuery(sql);
query.setParameter(1,map.get("id"));
resurlt= query.executeUpdate();
}catch (Exception e){
System.out.println("更新出错-----------------------");
e.printStackTrace(); }
return resurlt;
} @Transactional
@Override
public boolean delete(T entity) {
boolean flag=false;
try {
entityManager.remove(entityManager.merge(entity));
flag=true;
}catch (Exception e){
System.out.println("---------------删除出错---------------");
}
return flag;
} @Override
public Object findCount(String tablename, LinkedHashMap<String, Object> map) {
String sql="select count(u) from "+tablename+" u WHERE ";
Set<String> set=null;
set=map.keySet();
List<String> list=new ArrayList<>(set);
List<Object> filedlist=new ArrayList<>();
for (String filed:list){
sql+="u."+filed+"=? and ";
filedlist.add(filed);
}
sql=sql.substring(0,sql.length()-4);
System.out.println(sql+"--------sql语句-------------");
Query query=entityManager.createQuery(sql);
for (int i=0;i<filedlist.size();i++){
query.setParameter(i+1,map.get(filedlist.get(i)));
}
return query.getSingleResult();
}
}

这一套就可以完成一个项目的差不多增删改查了,需要其他特殊功能的可以自行添加

原文:https://www.cnblogs.com/zhouguanglin/p/7625655.html

EntityManager 的复杂查询的更多相关文章

  1. CUBA 使用 Spring 查询接口

    原文链接:https://www.cuba-platform.com/blog/spring-query-interfaces-in-cuba 翻译:CUBA China CUBA-Platform ...

  2. Spring Data JPA原生SQL查询

    package com.test.cms.dao.repository;import org.springframework.stereotype.Repository;import javax.pe ...

  3. jpql简单l查询

    JPQL全称Java Persistence Query Language package com.ytkj.entity; import javax.persistence.*; import ja ...

  4. jpa jpql @query 动态查询

    需求/背景 假设有一个用户表, 对应的用户实体: public class User { @Id Long id; //姓名 String name; //性别,男0女1 String sex; // ...

  5. (三)JPA - EntityManager的使用

    (二)JPA 连接工厂.主键生成策略.DDL自动更新 建议在需要使用时,看看之前的文章,先把环境搭起来. 4.EntityManager EntityManager 是完成持久化操作的核心对象. En ...

  6. jpa注解

    http://www.oracle.com/technetwork/cn/middleware/ias/toplink-jpa-annotations-100895-zhs.html#ManyToOn ...

  7. JPA详解

    2006 年 5 月 2 日,EJB 3.0 规范最终版由 JCP(Java Community Process) 正式公布,标准号为 JSR(Java Specification Request)2 ...

  8. "No entity found for query"(转)

    很久以前一直用EntityManager下getResultList()查询数据,即便一个数据亦是如此,所以要频繁的List.get(0).新接口getSingleResult()出现了,然后就开始频 ...

  9. 6、JPA-映射-单向一对多

    一个用户对应多个订单 实体类 Customer package com.jpa.yingshe; import javax.persistence.*; import java.util.HashSe ...

随机推荐

  1. JAVA大数的一些操作

    参考: https://www.cnblogs.com/tonyyy/p/10433460.html https://www.cnblogs.com/wkfvawl/p/9377441.html (d ...

  2. 两台三层交换机单区域OSPF动态路由实验

    一.   实验目的 1.  掌握三层交换机之间通过OSPF协议实现网段互通的配置方法. 2.  理解RIP协议和OSPF协议内部实现的不同点 二.   应用环境 当两台三层交换机级联时,为了保证每台交 ...

  3. function函数——函数的定义及参数

    #_*_coding:utf-8_*_#作者:王佃元#日期:2019/12/21#函数function subrouting \ procedure#函数的意义 # 1.减少代码重复 # 2.更易扩展 ...

  4. [RN] windows7 安装 Realm Studio 后,打开报错 A JavaScript error occurred in the main process

    windows7  安装 Realm Studio 后,打开报错 报错如下: A JavaScript error occurred in the main process Uncaught Exce ...

  5. VC修改本机IP地址

    http://www.vcchar.com/thread-1527-1-1.html 设置IP地址只需要更改注册表中关于适配器的相应设置,但更改后需要重新启动系统才能生效,而AddIPAddress函 ...

  6. [LeetCode] 24. Swap Nodes in Pairs 成对交换节点

    Given a linked list, swap every two adjacent nodes and return its head. You may not modify the value ...

  7. github git clone ssh协议 clone超慢解决方案,提高Github Clone速度

    即使进行了fq吧但是git clone ssh协议就是慢 2kb/s你能忍,坚决不能忍. github git clone ssh协议 clone超慢解决方案 151.101.72.249 globa ...

  8. mac 下使用shell 命令 jq 解析json

    官网 https://stedolan.github.io/jq/download/ 安装 brew install jq 创建json文件,file.json { , "msg" ...

  9. kinaba 安装踩坑: FATAL Error: [elasticsearch.url]: definition for this key is missing

    操作系统:Linux kibana 版本: 7.4.0 1. 在/etc/yum.repos.d/ 下新建 kibana.repo  配置 yum 源地址 内容如下: [root@localhost ...

  10. JMM与happens-before

    happens-before是JMM最核心的概念,理解happens-before是理解JMM的关键. 一.JMM的设计 首先,让我们先分析一下JMM的设计意图.从JMM的设计者的角度,在设计JMM的 ...