• zbb20180712 Srping框架中使用@query注解实现复杂查询


    Srping框架中使用@query注解实现复杂查询

        public List<Org> findByParentOrg(Org org, Sort s);
    
        public List<Org> findByParentOrg(Org org);
    
        public List<Org> findByParentOrgAndStateNot(Org org, Integer state, Sort s);
    
        public List<Org> findByParentOrgAndStateNot(Org org, Integer state);
    
        // Org findByOrgCode(String orgCode);
        public List<Org> findByOrgCode(String orgCode);
    
        public List<Org> findByOrgName(String orgName);
    
        public Org findByIdAndStateNot(Long id, Integer state);
    
        /**
         * 根据机构等级查询机构
         * 
         * @param orgLevel
         * @return
         */
        public List<Org> findByOrgLevelAndState(String orgLevel, Integer state);
    
        /**
         * 根据机构等级查询机构
         * 
         * @param orgLevel
         * @return
         */
        @Query(" select emp.org from Employee emp where emp.employeeNum=:employeeNum and emp.state =:state ")
        public Org findByEmployeeNum(@Param("employeeNum") String employeeNum, @Param("state") Integer state);
    
        /**
         * 查询正常状态的所有机构
         * 
         * @param state
         * @return
         */
        public List<Org> findByState(int state);
    
        public Page<Org> findByState(int state, Pageable page);
    
        @Query("select o from Org o where o.state = 1 and o.orgCode like :orgCode")
        public Page<Org> findByOrgCode(@Param("orgCode") String orgCode, Pageable page);
    
        @Query("select o from Org o where o.state = 1 and o.orgName like :orgName")
        public Page<Org> findByOrgName(@Param("orgName") String orgName, Pageable page);
    
        @Query("select o from Org o where o.state = 1 and o.orgName like :orgName and o.orgCode like :orgCode")
        public Page<Org> findByOrgCodeAndOrgName(@Param("orgCode") String orgCode, @Param("orgName") String orgName,
                Pageable page);
    
        @Query("select o from Org o where o.state = 1 and o.id not in (select op.org.id from ShiroOrgPermission op)")
        public List<Org> findbyPermission();

    在Spring框架中,关于从数据表获取数据有不同的方法,当数据查询比较简单时,可以通过继承JpaRepository<T, L> 使用findBy***方法,通过分析方法名来实现查询,T表示要查询的数据表所对应的实体,L表示该实体主键的类型,比如Long。关于findBy方法如何通过分析方法名来实现查询,网上资料很多,不做赘述。
        如果查询的数据比较复杂,查询条件比较复杂时,可以考虑使用JPA的@query方法来实现查询。关于使用方法,下面做简单介绍:

    1.首先Dao层需继承Repository<T, L>,T为实体名,L为该实体的主键类型。
    2.写查询方法,并使用@query进行注解,例如:
    @query(select u from User u where name=?1 and age=?2)
    List findUser(String name,int age);
    在这里,User为实体名,参数中的name值在执行时可以赋值给?1的位置。
    但是,事实上,如果只是从一个数据表中获取数据,使用上面所说的findBy**方法即可,并不需要使用@query来实现。
    但是,当查询条件比较复杂,无法使用findBy方法时,就可以考虑使用@query.先给出一个例子:
    @Query("select max(jobinfo.processes) from Jobinfo jobinfo,Taskinfo taskinfo where taskinfo.jobid=jobinfo.id and (shenweistatus=4 or shenweistatus=5) and queuename=?1")
    List findMaxNuclear(String queuename);

    通过这条语句,可以看到其涉及到两个实体,查询的是max,用Findby是无法实现的,但是这个例子就可以很好的实现。而关于1中的T就没有多大意义,应该是随便写语句中涉及到的一个实体即可。
    关于其他的复杂查询都可以通过这种方法实现。
    再看下面这个例子:
    @Query("select jobinfo.queuename from Jobinfo jobinfo,Taskinfo taskinfo where taskinfo.jobid=jobinfo.id and (shenweistatus=1 or shenweistatus=3) and jobinfo.queuename like ?1 group by jobinfo.queuename")
    List findQueuenameByName(String name);

    里边涉及到了模糊查询,在SQL中,模糊查询应该是 like ‘%AA%’等形式的,但是这里的注解中如果加入了%,会报错,怎么解决呢?可以在调用该方法是人为的将%传进去,比如findQueuenameByName(“%”+name+”%”),这样就可以实现模糊查询。
    需要注意的是,我测试发现,这种方法只能查询一个字段,如果要查询多个字段,只能写多个方法,得到多个list,最后将查询结果拼到一块。(至于到底能不能一次查询多个字段,正在探索中。。。。)

  • 相关阅读:
    js事件入门(6)
    js事件入门(5)
    js事件入门(4)
    js事件入门(3)
    js事件入门(2)
    js事件入门(1)
    js语法基础入门(7)
    js语法基础入门(6)
    spark web ui
    命令行笔记(一)
  • 原文地址:https://www.cnblogs.com/super-admin/p/9299488.html
Copyright © 2020-2023  润新知