首页 > 解决方案 > 当实体没有 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 个额外的字段。

标签: javahibernatejpajdbcspring-data-jpa

解决方案


您可以在查询中使用 Projection 将所需模型映射到您的 POJO 对象


推荐阅读