java - 当实体没有 Select 查询中提到的 2 个字段时,如何在 JPA 中使用 Select Query 获取记录?
问题描述
我有一个实体ResourceHierarchy:
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name="resource_hierarchy")
public class ResourceHierarchy {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "resource_generator")
@SequenceGenerator(name="resource_generator", sequenceName = "resource_hierarchy__seq_no", allocationSize = 1)
@Column(name="RESOURCE_ID")
private Integer resourceID;
@Column(name="RESOURCE_NAME", nullable = false)
private String resourceName;
@Column(name="PARENT_RESOURCE_ID", nullable = false)
private String parentResourceID;
@Column(name="RESOURCE_TYPE", nullable = false)
private String resourceType;
@Column(name="TIME_ZONE", nullable = false)
private String timeZone;
@Column(name="LANGUAGE", nullable = false)
private String language;
@Column(name="EMAIL_ADDRESS")
private String emailAddress;
@Column(name="ORGANIZATION")
private String organization;
@Column(name="CREATED_BY")
private String createdBy;
@Column(name="CREATED_DTTM", nullable = false)
private Date createdDttm;
@Column(name="LAST_UPDATED_BY")
private String lastUpdatedBy;
@Column(name="LAST_UPDATED_DTTM")
private Date lastUpdatedDttm;
@Column(name="ACTIVE_FLAG")
private String activeFlag;
@Column(name="CAPACITY_TYPE")
private String capacityType;
@Column(name="DWA_FLAG")
private String dwaFlag;
public Integer getResourceID() {
return resourceID;
}
public void setResourceID( Integer resourceID) {
this.resourceID = resourceID;
}
public String getResourceName() {
return resourceName;
}
public void setResourceName(String resourceName) {
this.resourceName = resourceName;
}
public String getParentResourceID() {
return parentResourceID;
}
public void setParentResourceID(String parentResourceID) {
this.parentResourceID = parentResourceID;
}
public String getResourceType() {
return resourceType;
}
public void setResourceType(String resourceType) {
this.resourceType = resourceType;
}
public String getTimeZone() {
return timeZone;
}
public void setTimeZone(String timeZone) {
this.timeZone = timeZone;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public String getEmailAddress() {
return emailAddress;
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
public String getOrganization() {
return organization;
}
public void setOrganization(String organization) {
this.organization = organization;
}
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
public Date getCreatedDttm() {
return createdDttm;
}
public void setCreatedDttm(Date createdDttm) {
this.createdDttm = createdDttm;
}
public String getLastUpdatedBy() {
return lastUpdatedBy;
}
public void setLastUpdatedBy(String lastUpdatedBy) {
this.lastUpdatedBy = lastUpdatedBy;
}
public Date getLastUpdatedDttm() {
return lastUpdatedDttm;
}
public void setLastUpdatedDttm(Date lastUpdatedDttm) {
this.lastUpdatedDttm = lastUpdatedDttm;
}
public String getActiveFlag() {
return activeFlag;
}
public void setActiveFlag(String activeFlag) {
this.activeFlag = activeFlag;
}
public String getCapacityType() {
return capacityType;
}
public void setCapacityType(String capacityType) {
this.capacityType = capacityType;
}
public String getDwaFlag() {
return dwaFlag;
}
public void setDwaFlag(String dwaFlag) {
this.dwaFlag = dwaFlag;
}
@Override
public String toString() {
return "ResourceHierarchy [resourceID=" + resourceID + ", resourceName=" + resourceName + ", parentResourceID="
+ parentResourceID + ", resourceType=" + resourceType + ", timeZone=" + timeZone + ", language="
+ language + ", emailAddress=" + emailAddress + ", organization=" + organization + ", createdBy="
+ createdBy + ", createdDttm=" + createdDttm + ", lastUpdatedBy=" + lastUpdatedBy + ", lastUpdatedDttm="
+ lastUpdatedDttm + ", activeFlag=" + activeFlag + ", capacityType=" + capacityType + ", dwaFlag="
+ dwaFlag + "]";
}
}
我有 SELECT 查询:
selectclocksquery=SELECT resource_hierarchy_util.get_ancestor_name(a.resource_id, 'Business Unit') as businessUnit , resource_hierarchy_util.get_ancestor_name(a.resource_id, 'Region') as regionName , resource_id as resourceId , a.resource_name as resourceName , a.time_zone as timeZone FROM resource_hierarchy a WHERE resource_hierarchy_util.get_ancestor_name(a.resource_id, 'Business Unit') = :businessUnitValue AND a.resource_type = :resourceTypeValueA AND to_date(a.created_dttm) = to_date(:reorgDate) AND NOT EXISTS ( SELECT * FROM resource_hierarchy b WHERE b.parent_resource_id = a.resource_id AND b.resource_type = :resourceTypeValueB )
我必须迁移到 JPA。早些时候我使用的是 JDBC。当我做 JPA 并尝试获取这样的记录时:
List<com.att.dmp.entity.ResourceHierarchy> rAs = resourceHierarchyService.findRAForClocks(reorgDate);
然后在该选择查询中有 2 列不属于 ResourceHierarchy 实体。businessUnit 和 regionName 不在 ResourceHierarchy 实体中。但其他 3 个(resourceId、resourceName、timeZone)在 ResourceHierarchy 实体中。如何修改,以便在运行选择查询后,它可以正确地将这些值保存在实体中?早些时候我有模型课,我保留了 2 个额外的字段。
解决方案
您可以在查询中使用 Projection 将所需模型映射到您的 POJO 对象
推荐阅读
- javascript - 从父母的 onClick 在 reactjs 上更新状态子项
- malbolge - 如何在malbolge中打印用户输入?
- swift - 为什么数组(collCells)在快速传递来自不同 ViewController 的数组元素时显示为空?
- dialogflow-es - 如何在 DialogFlow java 客户端 v2 中设置上下文
- php - 如何通过知道该图像的 URL 来防止攻击者运行嵌入在 jpg 图像中的 PHP 代码?
- jsp - Jsp 没有在 Spring Boot 应用程序中由 Jersey 编译
- angular - Angular2:主机侦听器是否应该取消订阅?主机监听器如何工作?如果我不必退订,什么时候退订?
- javascript - UnderscoreJS - 如何展平嵌套属性
- javascript - 可变架构上的 XML 编辑
- c# - Selenium WebDriver C# - 需要绕过 Chrome 身份验证对话框