见结算项目
用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的例子中,我们通常会涉及以下几个核心概念: 1. **实体(Entity)**: 实体是与数据库表相对应的Java类。它们通常带有`@Entity`注解,表明这个类是一个JPA实体。例如: ```java @Entity public class User { ...
使用JTA管理EntityManager事务时,需要注意以下几个问题: * JTA事务只能运行在J2EE环境中,即EJB容器中和Web容器中,而在J2SE环境中只能使用RESOURCE_LOCAL管理事务。 * 容器托管的EntityManager对象只能采用JTA的...
为了更好地理解实体对象,这里以论坛应用为例介绍几种常见的实体对象类型: - **Topic**:表示论坛中的主题。 - **PollTopic**:一种特殊的主题,用于创建投票或调查。它继承自`Topic`。 - **PollOption**:表示...
8. **事务管理**:JPA支持事务管理,可以使用`@Transactional`注解在方法级别声明事务。事务控制可以帮助确保数据库操作的一致性和完整性。 由于这个工程仅在main方法中运行,没有前端界面,我们推测它可能是一个...
Spring Boot 使用 JPA 时间类型进行模糊查询的方法 Spring Boot 是一个流行的 Java 框架,用于构建基于 Spring 的应用程序。JPA(Java Persistence API)是 Java 持久层 API 的一个标准规范,用于实现数据库的持久...
实体的生命周期管理非常重要,JPA允许开发者通过以下几种方式来干预实体的生命周期事件: 1. **回调方法**:通过@PrePersist、@PostPersist、@PreUpdate、@PostUpdate、@PreRemove和@PostRemove等注解来定义生命...
在JPA中,批注是一种使用元数据修饰Java源代码的简单表达方法,它编译为相应的Java类文件,以便在运行时由JPA持久性提供程序解释以管理JPA行为。 JPA批注可以分为以下几个类别: 1. 实体默认情况下,JPA持久性提供...
3. **Querydsl**:Spring Data JPA可以与Querydsl结合使用,提供更强大的类型安全的查询能力。Querydsl允许开发者用Java对象表达复杂的查询语句,避免了SQL注入问题。 4. **Specifications**:Spring Data JPA的`...
- **JPA 实现者**:除了 Hibernate 外,还有其他几个实现 JPA 的工具,例如 TopLink 和 OpenJPA。 #### 三、JPA 的优势 - **标准化**:由于 JPA 提供了统一的 API,这意味着基于 JPA 开发的应用可以在不同的 JPA ...
JPA主要包含了以下几个方面的技术: 1. **ORM映射元数据**:支持XML和JDK 5.0注解两种元数据形式,用于描述对象与数据库表之间的映射关系。 2. **JPA API**:提供了一系列API,用于操作实体对象并执行增删改查(CRUD...
3. **JPA 查询**:JPA 支持两种主要的查询类型:原生 SQL 查询和 JPQL 查询。 - **Query 接口**:提供了执行查询的基础方法。 - **简单查询**:可以使用 Query 接口执行基本的查询操作。 - **使用参数查询**:...
开发者可以使用如下几种方式来定义接口: 1. 继承`JpaRepository`接口,该接口提供了大量通用的数据操作方法。 2. 继承`CrudRepository`接口,适用于更简单的CRUD操作。 3. 使用`@Query`注解来定义一些复杂的查询。 ...
**Java Persistence API (JPA)** 是Java平台上的一个标准,用于管理关系数据库中的数据,它为开发者提供了一种对象/关系映射(ORM)工具,将数据库操作转换为对Java对象的操作,简化了数据库编程。以下是对JPA的全面...
`Specification`是Spring Data JPA提供的一种强大工具,用于构建动态、复杂的查询条件,尤其适用于处理复杂的业务场景中的查询需求。在这里,我们深入探讨`Specification`的使用及其在实际开发中的价值。 首先,`...
在JPA出现之前,Java开发者通常使用以下几种方法来处理数据库持久化: - **JDBC(Java Database Connectivity)**:这是一个基础的数据库连接接口,提供了直接与数据库交互的能力。尽管强大,但JDBC代码往往繁琐且...
在“最好的JPA详解大全”这本书中,你将深入学习到JPA的核心概念和使用技巧,涵盖以下几个关键知识点: 1. **基本概念**:了解什么是ORM,为什么需要JPA,以及它与Hibernate等ORM框架的关系。理解实体(Entity)、...
- **查询查找策略:** Spring Data JPA 支持多种查询查找策略,如通过方法名生成查询、使用硬编码的查询字符串或使用存储过程等。 - **方法签名的灵活性:** 方法签名可以包含多个参数,支持按条件查询、排序和分页...
4. **Database Driver**:根据你所使用的数据库类型,需要相应的数据库驱动jar包,例如`mysql-connector-java.jar`对应MySQL,`ojdbc14.jar`对应Oracle,这些驱动使得Hibernate能够与特定的数据库进行通信。...
6. **查询API**:除了JPQL,Hibernate还提供了Criteria API,提供了一种更加类型安全的查询方式。 使用Hibernate JPA,开发者可以利用注解驱动的编程模型,减少代码量,同时通过ORM机制,使得业务逻辑和数据访问层...
Spring Boot简化了应用的初始搭建以及配置,而Spring Data JPA则是Spring Framework的一个模块,专门用于简化JPA(Java Persistence API)的使用,提供了一种声明式的方式来操作数据库。 首先,我们需要了解Spring ...