项目中JPA的使用

个人理解

1、定义一个xxxRepository继承JpaRepository
2、在定义的与数据库对应的类上加相应的@NamedQuery方法
3、实现xxxxDaoImple,xxxxrepository和entityManager实现DaoImple中的具体方法,一般简单的方法则用xxxxRepository类中的方法来实现
4、xxxRepository只是相当于把原来在dao层实现的简单方法,他本身封装起来了

javaConfig配置jpa

1、在LifeCircleWebConfig中@import (ApplicationConfig.class)就是引入jpa的配置到configuration的配置文件中去

LifeCircleWebConfig

2、配置ApplicationConfig类,它作为配置jpa的文件
图中数字解释:
1、要扫描这个的包,把这个包继承与JpaRepository的类都装到容器中成为一个bean
2、指定他的工厂类
3、导入xml文件,为后面的datasource的配置引入数据
4、引入InfrastructureConfig,和InfrastructureConfig4Question类,在这两个类中主要是配置entityManagerFactorytransactionManagerdefaultJdbcTemplate
ApplicationConfig

3、在MyRepositoryFactoryBean中如何引入代理的ProxyRepositoryImpl来实现的
(1)MyRepositoryFactoryBean在这定义一个内部成员类MyRepositoryFactory,这个类继承与
JpaRepositoryFactory,在这个类的构造方法中,把TransactionTemplate,JdbcTemplate,EntityManager等值给他,与数据库建立连接
Paste_Image.png

(2)编写getTargetRepository方法,告诉程序要返回的是ProxyRepositoryImpl,及所有的实现都是代理来做的,代理类中保存有具体的Repository
Paste_Image.png

(3)编写getRepositoryBaseClass方法,获取baseclass
Paste_Image.png

(4)MyRepositoryFactoryBean实现方法createRepositoryFactory方法,返回MyRepositoryFactory工厂类
Paste_Image.png

通过上面操作实现了指定Repository的工厂类。


xml和javaconfig配置jpa的区别参考

数字对照


Paste_Image.png

在InfrastructureConfig中


Paste_Image.png

在ApplicationConfig
Paste_Image.png

在InfrastructureConfig中


Paste_Image.png
Paste_Image.png

在InfrastructureConfig中


Paste_Image.png

Paste_Image.png

还是有些地方不清楚有时间在仔细看下,自己配置下


jpa配置自定义方法的

详细的参考
参考

1.根据方法名称
2.JPA的NameQueryies
注意命名的时要遵循DomainClass.methodName()的命名规则
(1):在实体类上使用@NamedQuery,示例如下:
@NamedQuery(name = "UserModel.findByAge",query = "select o from UserModel o where o.age >= ?1")
(2):在自己实现的DAO的Repository接口里面定义一个同名的方法,示例如下:
public List<UserModel> findByAge(int age);
(3):然后就可以使用了,Spring会先找是否有同名的NamedQuery,如果有,那么就不会按照接口定义的方法来解析。
3.@Query方式
在接口的方法上加注解,@Query 注解的使用非常简单,只需在声明的方法上面标注该注解,在变量上加上@Param("nn"),并且在sql语句中采用:nn来注入参数
@Query(value="select o from UserModel o where o.name like %:nn")
public List<UserModel> findByUuidOrAge(@Param("nn") String name);

多表查找的时候jpa怎么做

Paste_Image.png

就和平常写sql语句一样,只是table名称变为一个个与数据库表关联的

项目中怎么使用的

1、把所有的Repository的bean放到commonServiceHelper类中的map对象中,map的key是resType,使用的时候通过resType获得相对应的Repository
2、在包repository--sdk下找AssetRepository,继承了JpaRepository
3、增加的方法写在Asset实体类通过JPA的NameQueryies方式


Paste_Image.png

但是没得参数注入,都是where后面直接写参数的
4、具体的使用可参考AssetDaoImpl


Paste_Image.png

先过去EntityManage,直接createNamedQuery获取Query,再对参数设置相应的值query.setParameter("category", category);
再运行得值
5、sql中占位符
Paste_Image.png

JpaRepository常用方法

T save(T entity);//保存单个实体
Iterable<T> save(Iterable<? extends T> entities);//保存集合
T findOne(ID id);//根据id查找实体
boolean exists(ID id);//根据id判断实体是否存在
Iterable<T> findAll();//查询所有实体,不用或慎用!
long count();//查询实体数量
void delete(ID id);//根据Id删除实体
void delete(T entity);//删除一个实体
void delete(Iterable<? extends T> entities);//删除一个实体的集合
void deleteAll();//删除所有实体,不用或慎用!

项目中给他封装为

public T add(T bean)保存
public void del(String id)
public T update(T bean)
public T getByExample(T entity)
public List<T> getAllByExample(T entity)

education = (Education) resourceRepository.add(education);
 education = (Education) resourceRepository.update(education);
parentAsset = assetRepository.get(parent);//判断资源是否存在

获取这个repository对应的entityManager对象public EntityManager getEntityManager()

项目代码参考

用createNamedQuery

 public Chapter getLastChapterOnSameLevel(String mid, String parent) {
        Chapter lastOne = null;       
        Query query =        chapterRepository.getEntityManager().createNamedQuery("getLastChapterOnSameLevel");
        query.setParameter("tmid", mid);
        query.setParameter("pid", parent);
        query.setFirstResult(0);       //表示的是从查询记录的地几个开始,而不是从第几页开始
        query.setMaxResults(1);       //最多查询出几条
        List<Chapter> result = query.getResultList();   
        if(CollectionUtils.isNotEmpty(result)){
            lastOne = result.get(0);
        }  
        return lastOne;
    }

用em.createNativeQuery

public List<KnowledgeBaseModel> queryKnowledgeBaseListByKpid(String kpid) {
        List<KnowledgeBaseModel> returnList = new ArrayList<KnowledgeBaseModel>();
        String sql = "SELECT kb.identifier,kb.knid,kb.kpid,nd.title,nd.description,nd.creator,nd.create_time,cd1.title as kcname,cd2.title as kpname FROM knowledge_base kb,ndresource nd,category_relations cr,category_datas cd1,category_datas cd2 where cr.source=cd1.identifier and cr.target = cd2.identifier and cr.source=:kpid and kb.kpid = cr.target and nd.primary_category = 'knowledges' and nd.enable = 1 and kb.knid = nd.identifier";
        Query query = em.createNativeQuery(sql);
        query.setParameter("kpid", kpid);
        List<Object[]> list = query.getResultList();
        if(CollectionUtils.isNotEmpty(list)){
            for (Object[] o : list) {
                KnowledgeBaseModel kbm = new KnowledgeBaseModel();
                kbm.setIdentifier((String)o[0]);
                kbm.setKnid((String)o[1]);
                kbm.setKpid((String)o[2]);
                kbm.setTitle((String)o[3]);
                kbm.setDescription((String)o[4]);
                kbm.setCreator((String)o[5]);
                if(o[6] != null){
                    kbm.setCreateTime(new Date(((BigInteger)o[6]).longValue()));
                }
                kbm.setKcName((String)o[7]);
                kbm.setKpName((String)o[8]);
                returnList.add(kbm);
            }
        }
        return returnList;
    }

也有使用@Query方式的

public interface ResourceRelationRepository extends ResourceRepository<ResourceRelation>,
        JpaRepository<ResourceRelation, String> {   
    @Query("SELECT DISTINCT(p.target) FROM ResourceRelation p where p.sourceUuid in (?1) AND p.resourceTargetType=?2 AND relationType = ?3")
    List<String> findTargetIdsBySourceIdsAndTargetType(List<String> sourceIds,String targetType,String relationType);
    
    @Query("SELECT DISTINCT(p.sourceUuid) FROM ResourceRelation p where p.target in (?1) AND p.resType=?2 AND relationType = ?3")
    List<String> findSourceIdsByTargetIdsAndResType(List<String> targetIds,String resType,String relationType);

    @Query("SELECT t1 FROM ResourceRelation t1 where t1.resType=?1 and t1.resourceTargetType=?2 and t1.enable=1 and EXISTS(select 1 from Education t2 where t1.sourceUuid=t2.identifier and t2.enable=1) and EXISTS(select 1 from Education t2 where t1.target=t2.identifier and t2.enable=1) and t1.target=?3 ")
    List<ResourceRelation> findByResTypeAndTargetTypeAndTargetId(String resType, String targetType, String targetId);

    @Query("SELECT t1 FROM ResourceRelation t1 where t1.resType=?1 and t1.resourceTargetType=?2 and t1.enable=1 and EXISTS(select 1 from Education t2 where t1.sourceUuid=t2.identifier and t2.enable=1) and EXISTS(select 1 from Education t2 where t1.target=t2.identifier and t2.enable=1) and t1.sourceUuid=?3 ")
    List<ResourceRelation> findByResTypeAndTargetTypeAndSourceId(String resType, String targetType, String sourceId);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容