簡體   English   中英

如何使用 Hibernate 填充兩個實體字段?

[英]How do I populate two fields of entity using Hibernate?

我正在構建一個 API 以返回兩個字段:

{
    currentPoints: 325,
    badgeName: "Some Badge"
}

但是,我無法使用 hibernate 來填充這兩個字段。 我做了兩次嘗試,都拋出錯誤。 這兩個錯誤都可以在它們各自的存儲庫文件中找到。 在第二次嘗試中,我使用native=true並且能夠使用SELECT *使其工作。 但是,我試圖只填充並返回實體的兩個字段。

One solution I thought about is using the 2nd approach with a SELECT * and creating another package named response with CurrentInfoResponse class and just returning that class. 但是,我想看看是否有辦法使用我擁有的當前 model 來避免這種情況。

可能的解決方案:

@Getter
@AllArgsConstructor
public class CurrentInfoResponse{
    private Integer currentPoints;
    private String badgeName
}

Package 結構:

封裝結構

Controller.java:

@GetMapping("/current-badge/{userId}")
public CurrentBadgeInfoModel getCurrentBadge(@PathVariable Integer userId){
    return currentBadgeInfoService.getCurrentBadge(userId);
}

ServiceImpl.java:

@Override
public CurrentBadgeInfoModel getCurrentBadge(Integer userId){
    return currentBadgeInfoRepository.getCurrentBadge(userId);
}

CurrentBadgeInfoModel.java:

@Getter
@Entity
@Table(name = "user_current_badge_info")
public class CurrentBadgeInfoModel {

    @Id
    @Column(name = "user_current_info_id")
    private Integer userCurrentBadgeInfo;

    @Column(name = "user_id")
    private Integer userId;

    @Column(name = "current_points")
    private Integer currentPoints;

    @ManyToOne
    @JoinColumn(name = "badge_id")
    private BadgeModel badgeModel;
}

徽章型號.java

@Getter
@Entity
@Table(name = "badge_info")
public class BadgeModel {
    @Id
    @JoinColumn(name= "badge_id")
    private Integer badgeId;

    @Column(name = "badge_name")
    private String badgeName;
}

Repository.java - 嘗試 1:

@Repository
public interface CurrentBadgeInfoRepository extends JpaRepository<CurrentBadgeInfoModel, Integer> {

    @Query("SELECT cbim.currentPoints, cbim.badgeModel.badgeName FROM CurrentBadgeInfoModel cbim JOIN 
cbim.badgeModel WHERE cbim.userId=?1")
    CurrentBadgeInfoModel getCurrentBadge(Integer userId);
}

//Error: No converter found capable of converting from type [java.lang.Integer] to type [com.timelogger.model.CurrentBadgeInfoModel]

Repository.java - 嘗試 2:

@Repository
public interface CurrentBadgeInfoRepository extends JpaRepository<CurrentBadgeInfoModel, Integer> {

    @Query(value = "SELECT current_points, badge_name FROM user_current_badge_info ucbi JOIN badge_info bi ON ucbi.badge_id=bi.badge_id WHERE user_id=?1", nativeQuery = true)
    CurrentBadgeInfoModel getCurrentBadge(Integer userId);
}

//Error: Column 'user_current_info_id' not found

在這里使用 HQL 的SELECT 子句應該對您有所幫助。

如果你沒有那個構造函數,你可以添加它

@Query("SELECT new CurrentBadgeInfoModel(cbim.currentPoints, cbim.badgeModel.badgeName) FROM CurrentBadgeInfoModel cbim JOIN 
cbim.badgeModel WHERE cbim.userId=?1")

注意new CurrentBadgeInfoModel(cbim.currentPoints, cbim.badgeModel.badgeName)的用法

我認為這是Blaze-Persistence Entity Views的完美用例。

我創建了該庫以允許在 JPA 模型和自定義接口或抽象 class 定義的模型之間輕松映射,例如 Spring 類固醇上的數據投影。 這個想法是您以您喜歡的方式定義您的目標結構(域模型),並通過 JPQL 表達式將 map 屬性(吸氣劑)定義為實體 model。

使用 Blaze-Persistence Entity-Views 的 DTO model 可能如下所示:

@EntityView(CurrentBadgeInfoModel.class)
public interface CurrentInfoResponse {
    Integer getCurrentPoints();
    @Mapping("badgeModel.badgeName")
    String getBadgeName();
}

Spring 數據集成允許您幾乎像 Spring 數據投影一樣使用它: https://persistence.blazebit.com/documentation/entity-view/manual-html/

CurrentInfoResponse findByUserId(Integer userId);

最好的部分是,它只會獲取實際需要的 state!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM