![](/img/trans.png)
[英]How do I return only two fields from two separate tables using 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.