Spring Boot 那些事:Spring Data JPA 如何实现多表查询?

说明:
这篇文章只是一个照葫芦画瓢的实现记录,因为本人对数据库和JPA都不甚了解,很多东西似懂非懂,所以这里的记录也没啥实质内容。等待以后研究透彻后再来完善这篇的内容,如果大家有好的实现方式,请不吝赐教,万分感谢。

数据库表单如下,需要根据部门(或者公司名,或者人员姓名)获取所有的考勤记录:
返回数据要求: 分页,包括公司名,部门名,人员姓名,考勤时间。
如何实现?

table.png

研究来,研究去,没有找到理想的动态查询方法。最终根据这篇博客,勉强实现了查询
http://blog.csdn.net/trntaken/article/details/77870803

@NoRepositoryBean //该注解表示 spring 容器不会创建该对象  
public interface BaseRepository<T, ID extends Serializable> extends  PagingAndSortingRepository<T, ID>,JpaRepository<T,ID> {           
/**  
 * sql查询  
 *  
 * @param sql  
 * @param args  
 * @return  
 */  
List<Map> findAllByParams(String sql, Object... args);  
/**  
 * sql分页查询  
 *  
 * @param sql  
 * @param args  
 * @return  
 */  
Page<Map> findPageByParams(String sql, Pageable pageable, Object... args);  
}

--

public class BaseRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID>
    implements BaseRepository<T, ID> {

// 实体管理类,对持久化实体做增删改查,自动义sq操作模板所需要的核心类
public final EntityManager entityManager;

public BaseRepositoryImpl(JpaEntityInformation<T, ID> entityInformation, EntityManager entityManager) {
    super(entityInformation, entityManager);
    this.entityManager = entityManager;
}

@Override
@Transactional(rollbackFor = Exception.class)
public Page<Map> findPageByParams(String sql, Pageable pageable, Object... args) {
    Session session = (Session) entityManager.getDelegate();
    org.hibernate.Query q = session.createSQLQuery(sql);
    q.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
    int i = 0;
    for (Object arg : args) {
        q.setParameter(i++, arg);
    }

    List<Map> totalCount = q.list();
    q.setFirstResult(pageable.getPageSize() * (pageable.getPageNumber() - 1));
    q.setMaxResults(pageable.getPageSize());
    List<Map> pageCount = q.list();
    Page<Map> pages = new PageImpl<>(pageCount, pageable, totalCount.size());
    return pages;
}

@Override
@Transactional(rollbackFor = Exception.class)
public List<Map> findAllByParams(String sql, Object... args) {
    Session session = (Session) entityManager.getDelegate();
    org.hibernate.Query q = session.createSQLQuery(sql);
    // 查询结果转map
    q.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
    int i = 0;
    for (Object arg : args) {
        q.setParameter(i++, arg);
    }
    return q.list();
}

--

public interface AccessRecordRespository extends BaseRepository<AccessRecord, Long>,JpaSpecificationExecutor{

Page<AccessRecord> findByEmployeeId(String employeeid,Pageable pageable);

List<AccessRecord> findByAccessTimeBetween(long start ,long end);

Page<AccessRecord> findAll(Pageable pageable);

Page<AccessRecord> findByDeviceId(String deviceid,Pageable pageable);

Page<AccessRecord> findByDeviceName(String devicename,Pageable pageable);

Page<AccessRecord> findByDeviceIdAndDeviceName(String devicename,String name,Pageable pageable);

}

获取接口:

@PostMapping("/query_access_recordes3")
@ResponseBody
public BaseResponse test(@RequestBody QueryAccessRecordeRequest request ){  
     
      String sql= "select company.name as companyname,department.name as departmentname,employee.name as name,access.time as time from company, department,employee,access where  access.employee_id=employee.id and employee.department_id = department.id and department.company_id=company.id and employee.name = ?";
      Page<Map>  orderLists = accessRecordRespository.findPageByParams(sql,new PageRequest(0,10),"张三");  
      BaseResponse rsp = new BaseResponse();
      rsp.setBody(orderLists);
      return   rsp;  
}  

最终返回的结果如下:

{
"result": 0,
"body": {
    "content": [
        {
            "companyname": "IBM",
            "departmentname": "研发部",
            "name": "张三",
            "time": "2017-11-3 09:30"
        },
        {
            "companyname": "IBM",
            "departmentname": "研发部",
            "name": "张三",
            "time": "2017-11-4 09:30"
        },
       .......
    ],
    "totalPages": 18,
    "totalElements": 180,
    "last": false,
    "number": 0,
    "size": 10,
    "sort": null,
    "first": true,
    "numberOfElements": 10
}}

未实现部分: 动态搜索考勤记录 ,即 公司名,部门名 ,姓名,考勤时间 自由组合作为参数,如何处理?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容