最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot?jpa之返回表中部分字段的處理詳解

 更新時間:2021年12月07日 10:01:06   作者:向陽居士  
這篇文章主要介紹了springboot?jpa之返回表中部分字段的處理詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

springboot jpa返回表中部分字段

使用springboot jpa操作數(shù)據(jù)庫可以加快我們的開發(fā)效率,對于簡單的crud操作來說,使用jpa來開發(fā)不要太爽,但是說實話對于一些復雜的數(shù)據(jù)庫操做jpa使用起來就不是這么爽了。

在開發(fā)中很多時候我們要返回的可能只是數(shù)據(jù)庫表中或某個類中的一部分字段,這個要是用mybatis的話就很簡單,直接在sql中select字段就好了,規(guī)范一點就數(shù)據(jù)傳輸類接一下,偷個懶的話直接用map接就完事了。但就是這么個小操作在jpa中就不能這么直接。

廢話一大堆(⊙_⊙)下面是我在jpa中處理返回部分字段的方法。

/**
 * 房間已經(jīng)預定的時間統(tǒng)計表
 */
public interface RoomOrderTimeRepository extends JpaRepository<RoomOrderTime,Integer>{ 
    @Query("select  new com.ddzrh.dto.RoomOrderTimeOutPut(r.orderTime,COUNT(r.orderTime) )" +
            " from RoomOrderTime as r " +
            " where r.roomTypeId =:roomId"+
            " GROUP BY r.orderTime" )
    List<RoomOrderTimeOutPut> queryRoomOrderTime(@Param("roomId") Integer roomId);  
}

看完上面的代碼相比大家也能猜到,是的沒什么好方法,我將要返回的數(shù)據(jù)都封裝到了RoomOrderTimeOutPut類中。

@Data
public class RoomOrderTimeOutPut { 
    private Date orderTime;
    private Long orderNum; 
    public RoomOrderTimeOutPut(Date orderTime, Long orderNum) {
        this.orderTime = orderTime;
        this.orderNum = orderNum;
    }    
}

像上面的代碼,我希望查詢返回某個時間某間房的預定數(shù),我就將希望返回的預定時間和預定數(shù)封裝至RoomOrderTimeOutPut并寫以這兩個字段為入?yún)⒌臉?gòu)造函數(shù),這個構(gòu)造函數(shù)一定要寫??碤uery中的sql 有一個new RoomOrderTimeOutPut 的操作,這里就調(diào)用了構(gòu)造函數(shù),根據(jù)構(gòu)造函數(shù)的入?yún)?shù)據(jù)庫查出的值傳入。

jpa 自定義返回字段

實體類:User.java

@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "user")
public class User extends AbstractEntity { 
    @Column(unique = true)
    private String username; 
    private String password; 
    private String nickname; 
    private String email; 
    @Column(name = "org_id")
    private Long orgId; 
    @Column(name = "org_name")
    private String orgName;
}

DTO類:UserDTO.java

import lombok.Value; 
/**
 * @author wu qilong
 * @date 2019/4/11
 * @Description: 自定義返回值,字段名稱要和User實體類中的一致,加上lombok.@Value注解。
 */
@Value
public class UserDTO { 
    private String username; 
    private String nickname; 
    private String email;
}

repository類:UserRepository.java

/**
 * @author Wu Qilong
 * @date 2019/4/11
 * @Description:
 */
public interface UserRepository extends JpaRepository<User, Long> {
 
    /**
     * 用戶名查詢
     *
     * @param username
     * @return
     */
    Optional<User> findByUsername(String username);
 
 
    /**
     * 用戶名查詢
     * @param username
     * @return
     */
    <T> Optional<T> findByUsername(String username, Class<T> type);
}

測試:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UoServerApplicationTests { 
    @Autowired
    UserRepository userRepository; 
    @Test
    public void contextLoads() {
        UserDTO userDTO = userRepository.findByUsername("wuqilong", UserDTO.class).get();
        Console.log(userDTO);
    }
}

注意:返回的DTO中屬性名稱需要和實體類中字段名一致,且加上lombok包中的@Value注解,這種方式對于只需要返回表中部分的字段很方便,如果需要自定義返回字段名稱,可以參考以下方法:

需求:統(tǒng)計注冊人數(shù)

定義一個返回對象

使用@Query(value = "select new com.wd.cloud.uoserver.dto.TjVO(u.orgId ,count(u.orgId)) from User u group by orgId")進行查詢。

@Value
public class TjVO { 
    Long orgId; 
    Long registerCount;
}
/**
     * 按機構(gòu)統(tǒng)計注冊人數(shù)
     * @param pageable
     * @return
     */
    @Query(value = "select new com.wd.cloud.uoserver.dto.TjVO(u.orgId ,count(u.orgId)) from User u group by orgId")
    Page<TjVO> tjByOrgId(Pageable pageable);

或者也可以用下面的方法:

定義一個接口,用getXxx定義返回字段。xxx需要和返回字段的別名一致。

如果不一致,可以使用org.springframework.beans.factory.annotation包中的@Value進行映射

public interface TjDTO { 
    /**
     * 所屬機構(gòu)
     * @return
     */
    Long getOrgId();
    /**
     * 注冊時間
     * @return
     */
    String getRegisterDate();
 
    /**
     * 注冊數(shù)量
     * @return
     */
    String getRegisterCount();
 
    /**
     * 管理員數(shù)量 當別名與該getXXX名稱不一致時,可以使用該注解調(diào)整
     * @return
     */
    @Value("#{target.adminCount}")
    Long getManagerCount(); 
}

repository類:UserRepository.java添加方法tjByOrgId(),返回orgId和registerCount

 /**
     * 按天統(tǒng)計注冊人數(shù)
     * @return
     */
    @Query(value = "select DATE_FORMAT(gmt_create,\"%Y-%m-%d\") as registerDate,count(*) as registerCount from user group by registerDate",nativeQuery = true)
    List<TjDTO> tj();
 
    /**
     * 按機構(gòu)統(tǒng)計注冊人數(shù)
     * @param pageable  分頁
     * @return
     */
    @Query(value = "select org_id as orgId,count(*) as registerCount from user group by orgId",
            countQuery = "select count(*) from user group by org_id", nativeQuery = true)
    Page<TjDTO> tjByOrgId(Pageable pageable);

測試:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UoServerApplicationTests { 
    @Autowired
    UserRepository userRepository; 
    @Test
    public void contextLoads() {
        List<TjDTO> tjDTOList = userRepository.tj();
        tjDTOList.forEach(tjDTO -> {
            Console.log("registerDate={},registerCount={}", tjDTO.getRegisterDate(), tjDTO.getRegisterCount());
        });
    }
}

結(jié)果日志:

Hibernate: select DATE_FORMAT(gmt_create,"%Y-%m-%d") as registerDate,count(*) >as registerCount from user group by registerDate
registerDate=2019-01-28,registerCount=7393
registerDate=2019-03-07,registerCount=1

需求:根據(jù)機構(gòu)分組,統(tǒng)計機構(gòu)總?cè)藬?shù)和用戶類型為2的人數(shù)

@Component
public class SpecBuilder { 
    @PersistenceContext
    private EntityManager entityManager; 
    public List<Object[]> tj(Long orgId) {
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<Object[]> query = cb.createQuery(Object[].class);
        Root<User> root = query.from(User.class);
        //拼接where條件
        List<Predicate> predicateList = new ArrayList<Predicate>();
        if (orgId != null) {
            predicateList.add(cb.equal(root.get("orgId"), orgId));
        }
        //加上where條件
        query.where(ArrayUtil.toArray(predicateList, Predicate.class));
        query.multiselect(root.get("orgId"),
                cb.count(root),
                cb.sum(cb.<Integer>selectCase().when(cb.equal(root.get("userType"), 2), 1).otherwise(0)));
        query.groupBy(root.get("orgId"));
        //最終sql:  select org_id,count(id),sum(case when user_type=2 then 1 else 0 end) from user where org_id=?1 group by org_id;
        TypedQuery<Object[]> typedQuery = entityManager.createQuery(query);
        return typedQuery.getResultList();
    } 
}

測試:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UoServerApplicationTests { 
    @Autowired
    SpecBuilder specBuilder;
 
    @Test
    public void contextLoads() {
        List<Object[]> tjDTOList1 = specBuilder.tj(169L);
        tjDTOList1.forEach(tjDTO -> {
            Console.log("orgId={},總?cè)藬?shù)={},管理員人數(shù)={}", tjDTO[0], tjDTO[1], tjDTO[2]);
        });
    }
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java循環(huán)隊列原理與用法詳解

    Java循環(huán)隊列原理與用法詳解

    這篇文章主要介紹了Java循環(huán)隊列原理與用法,結(jié)合實例形式詳細分析了Java循環(huán)隊列基本概念、原理、用法及操作注意事項,需要的朋友可以參考下
    2020-03-03
  • java基于數(shù)據(jù)庫實現(xiàn)全局唯一ID的示例

    java基于數(shù)據(jù)庫實現(xiàn)全局唯一ID的示例

    本文主要介紹了java基于數(shù)據(jù)庫實現(xiàn)全局唯一ID的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • springAOP完整實現(xiàn)過程

    springAOP完整實現(xiàn)過程

    當你調(diào)用SimpleService類的doSomething方法時,上述的PerformanceAspect會自動攔截此調(diào)用,并且記錄該方法的執(zhí)行時間,這樣你就完成了一個針對Spring的AOP入門級案例,感興趣的朋友一起看看吧
    2024-02-02
  • MyBatis-Plus 自定義sql語句的實現(xiàn)

    MyBatis-Plus 自定義sql語句的實現(xiàn)

    這篇文章主要介紹了MyBatis-Plus 自定義sql語句的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • Logback日志存放路徑不統(tǒng)一解決方案

    Logback日志存放路徑不統(tǒng)一解決方案

    這篇文章主要介紹了Logback日志存放路徑不統(tǒng)一解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • Java Clone深拷貝與淺拷貝的兩種實現(xiàn)方法

    Java Clone深拷貝與淺拷貝的兩種實現(xiàn)方法

    今天小編就為大家分享一篇關于Java Clone深拷貝與淺拷貝的兩種實現(xiàn)方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • java解析JT808協(xié)議的實現(xiàn)代碼

    java解析JT808協(xié)議的實現(xiàn)代碼

    這篇文章主要介紹了java解析JT808協(xié)議的實現(xiàn)代碼,需要的朋友可以參考下
    2020-03-03
  • SpringBoot整合Mybatis-plus實現(xiàn)多級評論功能

    SpringBoot整合Mybatis-plus實現(xiàn)多級評論功能

    本文介紹了如何使用SpringBoot整合Mybatis-plus實現(xiàn)多級評論功能,同時提供了數(shù)據(jù)庫的設計和詳細的后端代碼,前端界面使用的Vue2,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-05-05
  • java中對list分頁并顯示數(shù)據(jù)到頁面實例代碼

    java中對list分頁并顯示數(shù)據(jù)到頁面實例代碼

    這篇文章主要介紹了java中對list分頁并顯示數(shù)據(jù)到頁面實例代碼,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Java AQS的實現(xiàn)原理詳解

    Java AQS的實現(xiàn)原理詳解

    這篇文章主要借助了ReentrantLock來帶大家搞清楚AQS的實現(xiàn)原理,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2023-04-04

最新評論

蓬莱市| 伊金霍洛旗| 石河子市| 黔南| 志丹县| 富宁县| 阿尔山市| 汽车| 德格县| 响水县| 绵竹市| 康平县| 大方县| 峨山| 招远市| 马龙县| 高平市| 天长市| 贵阳市| 聂拉木县| 广东省| 宜兰县| 辽阳市| 丰镇市| 香港 | 南澳县| 永清县| 新巴尔虎右旗| 蓬溪县| 万载县| 固镇县| 平遥县| 三江| 旅游| 连州市| 漾濞| 双柏县| 抚松县| 织金县| 高阳县| 平阴县|