`
y806839048
  • 浏览: 1119193 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

jpa使用方法的几种分类

    博客分类:
  • jpa
jpa 
阅读更多

见结算项目

 

 

用jpa的都是单实体,如果需要复杂bo查询需要再dao上嫁接一个接口,其实现类用jdmctemlpate,或mybatis(用的时候还是用主的dao接口,否则无需嫁接到其上(这是只能用另起的接口的)

jpa使用大致分二种:(都是基于单个实体的),此二者都有自带分页的参数方法(都是单体

 

 

1,继承JpaRepository的dao可以用@query注解 也可根据名字判别查询(简单条件)

 

 

2,继承JpaSpecificationExecutor实现复杂条件(有为空情况下的查询),自动有传入分页信息的接口(不必再PagingAndSortingRepository)

 

另:如果需要查询bo复杂bo需要再dao上嫁接一个接口,其实现类用jdmctemlpate,或mybatis(用的时候还是用主的dao接口)

 

 

1根据名称判别  实体(这种没有继承任何的是为了查询bo的嫁接接口)

public interface ISettFundRepository {

 

public Page<TbSettFundVo> findAll(FundQueryVo vo);

 

}

 

2@Query   只有继承了JpaRepository才有@query()才有根据名字查询特性

 

  2.1  实体

public interface SettFundRepository extends JpaRepository<TbSettFund, TbSettFundPK>,ISettFundRepository{

 

/**

* 根据类型查询单个账户 用于查询清收、利息、手续费子账户

* 手续费子账户 3

* 利息子账户 4

* 清收子账户 5

* @param custType

* @return

*/

public TbSettFund findFirstByCustType(int custType);

 

@Query("select t from TbSettFund t where t.id.custAcctId=?1")

public TbSettFund findByCustAcctId(String custAcctId);

}

 

bo

 

///对于有bo查询就不能用jpa了,方式1,用模版中的query,需用其他结合如jdbctemplate  ,看项目中封装的PageQuery.java,此时和jpa无关,嫁接到其上而已

 

public class SettFundRepositoryImpl implements ISettFundRepository {

 

 

@Autowired

private PageQuery pageQuery;

 

@Override

public Page<TbSettFundVo> findAll(FundQueryVo vo) {

 

StringBuilder sb = new StringBuilder("select b.cust_name,a.* from tb_sett_fund a ,tb_sett_account b where a.cust_acct_id=b.cust_acct_id");

 

if (!StringUtils.isEmpty(vo.getThirdCustId())){

sb.append(" and a.third_cust_id like '%"+vo.getThirdCustId()+"%'");

}

if (!StringUtils.isEmpty(vo.getCustName())){

sb.append(" and b.cust_name like '%"+vo.getCustName()+"%'");

}

sb.append(" order by a.tran_date desc");

 

return pageQuery.query(sb.toString(), vo, TbSettFundVo.class);

}

 

}

 

///druid分页

private String pageSql(String sql,Pageable pageable){

 

return PagerUtils.limit(sql,  JdbcConstants.ORACLE, pageable.getOffset(), pageable.getPageSize());

 

//StringBuilder sb = new StringBuilder("SELECT *  FROM (SELECT row_.*, ROWNUM rownum_   FROM (");

//sb.append(sql);

//sb.append(") row_ where rownum <= ");

//sb.append(pageable.getOffset()+pageable.getPageSize());

//sb.append(") WHERE rownum_ > ");

//sb.append(pageable.getOffset());

//

//return sb.toString();

}

 

public <T> Page<T> query(String sql,BaseQueryVo vo,Class<T> voType) {

logger.info(sql);

Pageable pageable = vo.getPageable();

long total = count(sql);

List<T> list = jdbcTemplate.query(pageSql(sql, pageable), getMapper(voType));//////pageSql通过自己写的这个工具类分页(其实也是druid的)

Page<T> page = new PageImpl<T>(list, pageable, total);

//返回页数超出总页数 则取最后一页的数据

if (pageable.getOffset()>page.getTotalElements()){

PageRequest newPageable = new  PageRequest(page.getTotalPages()-1,pageable.getPageSize());

list = jdbcTemplate.query(pageSql(sql, newPageable), getMapper(voType));

page = new PageImpl<T>(list, newPageable, total);

}

return page;

 

}

 

 

 

////返回bo的方式2,模版中query中的用rowmapper

 

@SuppressWarnings("unchecked")

@Override

public List<TbSettInmoney> selectInmoney(TbSettInmoney entity) {

// TODO Auto-generated method stub

// String str= "2017-04-07 00:00:00";

SimpleDateFormat SFDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String strb=SFDate.format(entity.getBeginDate());//entity.getTranDate();

String stre=SFDate.format(entity.getEndDate());//entity.getTranDate();

List<TbSettInmoney> tb= jdbcTemplate.query("select * from TB_SETT_INMONEY t where t.acct_date>=to_date (? , 'YYYY-MM-DD HH24:MI:SS' ) and t.acct_date<=to_date (? , 'YYYY-MM-DD HH24:MI:SS' )", new Object[]{strb,stre},new RowMapper(){

 

@Override

public Object mapRow(ResultSet rs, int rowNum) throws SQLException {

// TODO Auto-generated method stub

TbSettInmoney tb= new TbSettInmoney();

tb.setInId(rs.getLong("IN_ID"));

tb.setCcyCode(rs.getString("CCY_CODE"));

tb.setCounterId(rs.getString("COUNTER_ID"));

tb.setSupAcctId(rs.getString("SUP_ACCT_ID"));

tb.setInAcctId(rs.getString("IN_ACCT_ID"));

tb.setInAcctIdName(rs.getString("IN_ACCT_ID_NAME"));

tb.setLogNo(rs.getString("LOG_NO"));

tb.setTranStatus(rs.getInt("TRAN_STATUS"));

// tb.setCustFlag(rs.getInt("CUST_FLAG"));

// tb.setTranDate(rs.getDate("TRAN_DATE"));

return tb;

}

 

});

System.out.println(tb.size());

return tb;

}

 

 

 

 

 

2.2

public interface SettPlatInfoRepository extends JpaRepository<TbSettPlatInfo, Long> {

 

@Query("select  t from TbSettPlatInfo t where t.infoId=(select max(s.infoId) from TbSettPlatInfo s)")

public List<TbSettPlatInfo> findTbSettPlatInfo();

 

}

 

 

 

 

 

3 复杂查询 JpaSpecificationExecutor  实体(只有继承了JpaSpecificationExecutor才有Specification方法)

 

 

public interface SettAccountRepository extends JpaRepository<TbSettAccount, TbSettAccountPK>,JpaSpecificationExecutor<TbSettAccount> {

 

@Query("select t from TbSettAccount t where t.id.custAcctId=?1")

public TbSettAccount findByCustAcctId(String custAcctId);

 

@Query("select t from TbSettAccount t where t.id.thirdCustId=?1")

public TbSettAccount findByThirdCustId(String thirdCustId);

 

@Query(value="select u.customer_key from tb_cus_firm u where u.customer_id=?1",nativeQuery=true)

public Long thirdIdSize(String thirdCustId);

 

/**

* 根据customer_key获得组织机构代码证

* @param customerKey

* @return

*/

@Query(value="select u.papers_num from tb_cus_firm_affix_chg u where u.customer_key=?1 and u.affix_kind='E'",nativeQuery=true)

public String getOrgCode(long customerKey);

}

 

@RequestMapping("accountList1")

@ResponseBody

public  Page<TbSettAccount> findAll(){

Page<TbSettAccount> pages = null;

 

Pageable page = new PageRequest(0,10);

pages = settAccountService.findAll(page);

 

List<TbSettAccount> list = pages.getContent();///////////spring的自带分页

 

 

return pages;

}

 

@Override

public Page<TbSettAccount> findAll(Pageable pageable) {

 

Specification<TbSettAccount> spec = new Specification<TbSettAccount>(){

 

@Override

public Predicate toPredicate(Root<TbSettAccount> root, CriteriaQuery<?> query, CriteriaBuilder cb) {

Expression<String> custId = root.get("id").get("thirdCustId").as(String.class);

 

List<Predicate> list = new ArrayList<Predicate>();

 

Predicate p = cb.equal(custId, "E00000062");

list.add(p);

Predicate p1 = cb.equal(root.get("idCode").as(String.class), "12343011-9");

// list.add(p1);

Predicate[] predicates = new Predicate[list.size()];

 

// return query.where(list.toArray(predicates)).getRestriction();

return null;

}};

 

Page<TbSettAccount> page = settAccountRepository.findAll(spec, pageable);

 

// Page<TbSettAccount> page = settAccountRepository.findAll(pageable);

List<TbSettAccount> list = page.getContent();

for (TbSettAccount account:list){

account.setFund(settFundService.findByCustAcctId(account.getId().getCustAcctId()));

}

return page;

}

 

 

 

 

 

 

 

参考:

 

http://www.cnblogs.com/jiangxiaoyaoblog/p/5635152.html

http://blog.csdn.net/lsk12162012/article/details/50442792

 

 

分享到:
评论

相关推荐

    jpa例子jpajpa

    在JPA的例子中,我们通常会涉及以下几个核心概念: 1. **实体(Entity)**: 实体是与数据库表相对应的Java类。它们通常带有`@Entity`注解,表明这个类是一个JPA实体。例如: ```java @Entity public class User { ...

    如何控制JPA的事务

    使用JTA管理EntityManager事务时,需要注意以下几个问题: * JTA事务只能运行在J2EE环境中,即EJB容器中和Web容器中,而在J2SE环境中只能使用RESOURCE_LOCAL管理事务。 * 容器托管的EntityManager对象只能采用JTA的...

    jpa操作mysql数据库

    8. **事务管理**:JPA支持事务管理,可以使用`@Transactional`注解在方法级别声明事务。事务控制可以帮助确保数据库操作的一致性和完整性。 由于这个工程仅在main方法中运行,没有前端界面,我们推测它可能是一个...

    openjpa-manual

    实体的生命周期管理非常重要,JPA允许开发者通过以下几种方式来干预实体的生命周期事件: 1. **回调方法**:通过@PrePersist、@PostPersist、@PreUpdate、@PostUpdate、@PreRemove和@PostRemove等注解来定义生命...

    jpa注解详解

    在JPA中,批注是一种使用元数据修饰Java源代码的简单表达方法,它编译为相应的Java类文件,以便在运行时由JPA持久性提供程序解释以管理JPA行为。 JPA批注可以分为以下几个类别: 1. 实体默认情况下,JPA持久性提供...

    Spring Data JPA 笔记

    3. **Querydsl**:Spring Data JPA可以与Querydsl结合使用,提供更强大的类型安全的查询能力。Querydsl允许开发者用Java对象表达复杂的查询语句,避免了SQL注入问题。 4. **Specifications**:Spring Data JPA的`...

    尚硅谷 jpa

    - **JPA 实现者**:除了 Hibernate 外,还有其他几个实现 JPA 的工具,例如 TopLink 和 OpenJPA。 #### 三、JPA 的优势 - **标准化**:由于 JPA 提供了统一的 API,这意味着基于 JPA 开发的应用可以在不同的 JPA ...

    java JPA 用法

    JPA主要包含了以下几个方面的技术: 1. **ORM映射元数据**:支持XML和JDK 5.0注解两种元数据形式,用于描述对象与数据库表之间的映射关系。 2. **JPA API**:提供了一系列API,用于操作实体对象并执行增删改查(CRUD...

    详细介绍 jpa 开发文档

    3. **JPA 查询**:JPA 支持两种主要的查询类型:原生 SQL 查询和 JPQL 查询。 - **Query 接口**:提供了执行查询的基础方法。 - **简单查询**:可以使用 Query 接口执行基本的查询操作。 - **使用参数查询**:...

    springdatajpa.pdf

    开发者可以使用如下几种方式来定义接口: 1. 继承`JpaRepository`接口,该接口提供了大量通用的数据操作方法。 2. 继承`CrudRepository`接口,适用于更简单的CRUD操作。 3. 使用`@Query`注解来定义一些复杂的查询。 ...

    jpa 全面学习资料

    **Java Persistence API (JPA)** 是Java平台上的一个标准,用于管理关系数据库中的数据,它为开发者提供了一种对象/关系映射(ORM)工具,将数据库操作转换为对Java对象的操作,简化了数据库编程。以下是对JPA的全面...

    spring.jpa.data Specification使用

    `Specification`是Spring Data JPA提供的一种强大工具,用于构建动态、复杂的查询条件,尤其适用于处理复杂的业务场景中的查询需求。在这里,我们深入探讨`Specification`的使用及其在实际开发中的价值。 首先,`...

    jpa开发手册.doc

    在JPA出现之前,Java开发者通常使用以下几种方法来处理数据库持久化: - **JDBC(Java Database Connectivity)**:这是一个基础的数据库连接接口,提供了直接与数据库交互的能力。尽管强大,但JDBC代码往往繁琐且...

    最好的JPA详解大全

    在“最好的JPA详解大全”这本书中,你将深入学习到JPA的核心概念和使用技巧,涵盖以下几个关键知识点: 1. **基本概念**:了解什么是ORM,为什么需要JPA,以及它与Hibernate等ORM框架的关系。理解实体(Entity)、...

    spring data jpa参考文档

    - **查询查找策略:** Spring Data JPA 支持多种查询查找策略,如通过方法名生成查询、使用硬编码的查询字符串或使用存储过程等。 - **方法签名的灵活性:** 方法签名可以包含多个参数,支持按条件查询、排序和分页...

    jpa配置的jar包

    4. **Database Driver**:根据你所使用的数据库类型,需要相应的数据库驱动jar包,例如`mysql-connector-java.jar`对应MySQL,`ojdbc14.jar`对应Oracle,这些驱动使得Hibernate能够与特定的数据库进行通信。...

    hibernate-jpa.jar

    6. **查询API**:除了JPQL,Hibernate还提供了Criteria API,提供了一种更加类型安全的查询方式。 使用Hibernate JPA,开发者可以利用注解驱动的编程模型,减少代码量,同时通过ORM机制,使得业务逻辑和数据访问层...

    springBoot整合springData JPA

    Spring Boot简化了应用的初始搭建以及配置,而Spring Data JPA则是Spring Framework的一个模块,专门用于简化JPA(Java Persistence API)的使用,提供了一种声明式的方式来操作数据库。 首先,我们需要了解Spring ...

    JPA_批注参考

    本文档主要介绍 JPA 中的批注(Annotation)及其使用方法。 #### 二、JPA 批注的重要性 JPA 批注是实现 JPA 功能的关键组成部分之一。通过使用批注,开发人员可以在不修改源代码结构的前提下,定义实体类的映射规则...

Global site tag (gtag.js) - Google Analytics