sql语句写法,jpa,em

本文详细介绍了如何使用复杂的SQL查询结合动态条件过滤,实现高效的数据检索与分页展示,特别聚焦于处理大规模代理结算数据的场景。通过具体代码示例,展示了如何构建SQL查询语句,包括联表查询、条件拼接、聚合函数使用,以及如何利用自定义工具类进行分页查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



 

 

 

 

@Override
 public Page<AgentCountInfo> findAgent(AgentQuery query, Pageable page) {
  // TODO Auto-generated method stub
  StringBuffer whereCause = new StringBuffer();
  Map<String,Object> params = new HashMap<>();
  if(query.hasBill()) {
   whereCause.append(" AND S.BILL_NO=:bill");
   params.put("bill", query.getBill());
  }
  if(query.hasMobile()) {
   whereCause.append(" AND A.MOBILE=:mobile");
   params.put("mobile", query.getMobile());
  }
  if(query.hasName()) {
   whereCause.append(" AND A.`NAME` LIKE '%' :name '%'");
   params.put("name", query.getName());
  }
  if(query.hasOrg()) {
   whereCause.append(" AND A.ORG_NAME=:org");
   params.put("org", query.getOrg());
  }
  String sql = "SELECT" +
    " A.*," +
    "  COUNT(S.BILL_NO) TOTAL," +
    "  SUM(B.PRIZE) AMOUNT," +
    "  (SELECT IFNULL(SUM(AMOUNT),0) FROM T_ITF_AGENT_SETTLEMENT WHERE CLEAN_FLAG=0 AND ID_CARD=A.ID_CARD) CLEAN," +
    "  (SELECT IFNULL(SUM(AMOUNT),0) FROM T_ITF_AGENT_SETTLEMENT WHERE CLEAN_FLAG=1 AND ID_CARD=A.ID_CARD) UNCLEAN," +
    " SUM(S.AMOUNT) POUNDAGE," +
    " SUM(C.CLEAN_AMOUNT) COMMISSION," +
    " U.ACTIVE_STATUS STATUS" +
    " FROM" +
    " T_ITF_AGENT_INFO A," +
    " T_ITF_AGENT_SETTLEMENT S," +
    " T_ITF_AGENT_COMMISSION C," +
    "  T_ITF_BILL_INFO B," +
    "  T_USR_AGENT U" +
    " WHERE" +
    " A.ID_CARD = S.ID_CARD" +
    " AND A.ID_CARD = C.ID_CARD" +
    " AND S.BILL_NO = B.BILL_NO" +
    " AND A.ID_CARD = U.ID_CARD" + whereCause.toString() +
    " GROUP BY" +
    " A.ID_CARD";
  
  return util.queryPage(sql, params, AgentCountInfo.class, page);
 }

 

 

 

@Repository
public class DaoUtil {
    @PersistenceContext
    EntityManager em;

 

    public  int  getQueryCount(String sql,Map<String,Object> param){
        sql = "select count(*) as size from ("+sql+") as countSize";
        Query nativeQuery = em.createNativeQuery(sql);
        for(String key:param.keySet()){
            nativeQuery.setParameter(key,param.get(key));
        }
       return Integer.parseInt(nativeQuery.getSingleResult().toString()) ;
    }

 

    public <T> List<T> queryList(String sql, Map<String,Object> param , Class<? extends T> c){
        Query nativeQuery = em.createNativeQuery(sql.toString(),c);
        for(String key:param.keySet()){
            nativeQuery.setParameter(key,param.get(key));
        }
        return  nativeQuery.getResultList();
    }

    public <T> Page<T> queryPage(String sql, Map<String,Object> param , Class<? extends T> c, Pageable page){
        Query nativeQuery = em.createNativeQuery(sql.toString(),c);
        for(String key:param.keySet()){
            nativeQuery.setParameter(key,param.get(key));
        }
        int count = getQueryCount(sql.toString(), param);
        int startNum =page.getPageNumber()* page.getPageSize(); //分页从零开始
        nativeQuery.setFirstResult(startNum);
        nativeQuery.setMaxResults( page.getPageSize());
        List<T> resultList = nativeQuery.getResultList();
        return new PageImpl<T>(resultList,page,count);
    }
}

 



### 如何在 JPA 中使用原生 SQL 查询或 JPQL 编写自定义查询 #### 使用 JPQL 进行查询 JPQL(Java Persistence Query Language)是一种面向对象的查询语言,用于操作持久化实体。它允许开发者通过实体类名而非数据库表名来构建查询语句。以下是使用 JPQL 的基本方法: ```java public List<Customer> findCustomersByName(String name) { EntityManager em = getEntityManager(); TypedQuery<Customer> query = em.createQuery( "SELECT c FROM Customer c WHERE c.name = :name", Customer.class ); query.setParameter("name", name); return query.getResultList(); } ``` 上述代码展示了如何利用 `TypedQuery` 来执行基于参数化的 JPQL 查询[^1]。 #### 使用原生 SQL 查询 当 JPQL 无法满足复杂需求或者需要直接调优底层 SQL 性能时,可以选择使用原生 SQL 查询。这种方式提供了更大的灵活性,但也失去了部分 ORM 抽象的优势。下面是一个例子: ```java public List<Object[]> findCustomerDetailsNative() { EntityManager em = getEntityManager(); String sql = "SELECT id, name FROM customers"; Query nativeQuery = em.createNativeQuery(sql); return nativeQuery.getResultList(); } ``` 此示例演示了如何创建并运行一条简单的原生 SQL 查询[^2]。注意这里返回的是 `Object[]` 数组形式的结果集,因为未指定具体的实体映射关系。 #### 结合 JOIN FETCH 提升性能 对于关联多个实体的情况,可以通过 `JOIN FETCH` 减少 N+1 查询问题,从而提高效率。例如,如果希望一次性获取客户及其订单详情,则可采用如下方式实现: ```java public List<Customer> loadCustomersWithOrdersAndItems() { EntityManager em = getEntityManager(); TypedQuery<Customer> query = em.createQuery( "SELECT c FROM Customer c " + "JOIN FETCH c.orders o " + "JOIN FETCH o.items i", Customer.class ); return query.getResultList(); } ``` 这种方法能够显著降低因懒加载引发的数据检索次数过多的问题[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值