2016-06-21 53 views
0

大家好!hibernate查詢無法解析屬性,即使屬性存在且正確套管

我有一個方法,我用它來查找入場和入場列表與CourseRevision相關,但它似乎並不認可CourseRevision,即使它在實體類中。這裏是尋找招生代碼:

public List<AdmissionDTO> findAdmissions(final String searchPhrase, final String organisationId, final boolean useCourse, final boolean useAdmissionAlternatives, final boolean useApplicationStatusMap, final boolean useTeaching, final boolean useAdmissionSchemaSettings, final boolean useAdmissionSchemaUpload) throws DataAccessException { 
    logEntered(); 
    List<AdmissionDTO> resultsList = new ArrayList<AdmissionDTO>(); 
if (organisationId == null) { 
    log.warn("'organisationId' is NULL or empty!"); 
    return resultsList; 
} 

resultsList = new DTOListFetcher<AdmissionDTO, Admission>() { 
    @Override 
    protected Map<String, Object> getParameters() { 
     Map<String, Object> params = new HashMap<String, Object>(); 
     if (searchPhrase != null && searchPhrase.length() > 0) { 
      params.put("searchPhrase", MessageFormat.format("%{0}%", searchPhrase)); 
     } 
     params.put("organisationId", organisationId); 
     return params; 
    } 

    @Override 
    protected String getQueryString() { 
     String queryString = "from Admission a " + "left join fetch a.courseRevision cr " 
       + "left join fetch cr.course c " + "left join fetch c.courseDefinition " 
       + "left join fetch a.admissionAlternatives " + "left join fetch a.applications " 
       + "left join fetch a.teaching " + "left join fetch a.admissionSchemaSettings " 
       + "left join fetch a.admissionSchemaUploads " + "where a.organisationId in (select o.id from Organisation o where o.parentOrganisationId = :organisationId) "; 
     StringBuilder sb = new StringBuilder(queryString); 
     if (searchPhrase != null && searchPhrase.length() > 0) { 
      sb.append(" AND ("); 
      sb.append("lower(a.courseRevision.course.code) like lower(:searchPhrase)"); 
      sb.append(" OR lower(a.name) like lower(:searchPhrase)"); 
      sb.append(" OR lower(a.courseRevision.name) like lower(:searchPhrase)"); 
      sb.append(")"); 

     } 
     return sb.toString(); 
    } 

    @Override 
    protected AdmissionDTO createDTO(Admission bean) { 
     return new AdmissionDTO(bean, useCourse, useAdmissionAlternatives, useApplicationStatusMap, useTeaching, 
       useAdmissionSchemaSettings, useAdmissionSchemaUpload); 
    } 

    @Override 
    protected ResultTransformer getQueryResultTransformer() { 
     return Criteria.DISTINCT_ROOT_ENTITY; 
    } 
}.fetchList(); 

if (resultsList == null) { 
    throw new DataAccessException(
      "DataManager: an error has occurred while trying to find Admission objects in database!"); 
} 
logReturning(resultsList); 
return resultsList; 
} 

這是我DTOListFetcher:

public abstract class DTOListFetcher<DTO, E> { 

    private static final Log log = LogFactory.getLog(DTOListFetcher.class); 

    /** 
    * Return a map of parameters used for the hibernate query for this 
    * {@code DTOListFetcher}. Parameters in the map are identified by parameter 
    * name of {@code String} type. Parameter value can be any object or array 
    * of objects. 
    * 
    * @return a map with query parameters. 
    */ 
    protected abstract Map<String, Object> getParameters(); 

    /** 
    * Returns query string for this {@code DTOListFetcher} implementation. 
    * 
    * @return a hibernate query string. 
    */ 
    protected abstract String getQueryString(); 

    /** 
    * Method to create a DTO object from the provided entity object. 
    * 
    * @param object - an entity object from which the resulting DTO object will 
    * be created. 
    * @return a DTO object. 
    */ 
    protected abstract DTO createDTO(E object); 

    /** 
    * Empty implementation. Sublasses can override this method to apply extra 
    * actions for the DTO object. 
    * 
    * @param session - reference to the current session. 
    * @param item - entity item. 
    * @param dto - DTO object to update. 
    */ 
    protected void applyExtras(Session session, E item, DTO dto) { 
    } 

    /** 
    * The main public method of the class. It Implements basic algorithm for 
    * fetching list of items from the database. It calls some abstract methods 
    * that require specific logic which is implemented in extending classes. 
    * 
    * @return a list of {@code DTO} objects. 
    */ 
    public List<DTO> fetchList() { 
     logEntered(); 
     Transaction tx = null; 
     Session session = HibernateUtil.getSession(); 
     List<DTO> resultList = null; 
     try { 
      tx = session.beginTransaction(); 
      String queryString = getQueryString(); 
      Query query = session.createQuery(queryString); 

      ResultTransformer resultTransformer = getQueryResultTransformer(); 
      if (resultTransformer != null) { 
       query.setResultTransformer(resultTransformer); 
      } 

      Map<String, Object> parametersMap = getParameters(); 
      if (parametersMap != null && !parametersMap.isEmpty()) { 
       for (String key : parametersMap.keySet()) { 
        Object param = parametersMap.get(key); 
        if (param instanceof Object[]) { 
         query.setParameterList(key, (Object[]) param); 
        } 
        else { 
         query.setParameter(key, param); 
        } 
       } 
      } 
      List<E> results = query.list(); 
      if (results != null) { 
       resultList = new ArrayList<DTO>(); 
       for (E item : results) { 
        DTO dto = createDTO(item); 
        applyExtras(session, item, dto); 
        resultList.add(dto); 
       } 
      } else { 
       log.warn("The query returned NULL!"); 
      } 
      commit(tx); 
     } catch (Exception e) { 
      handleException(e, tx); 
      // Returned result will be NULL if error occurs! 
      resultList = null; 
     } finally { 
      HibernateUtil.closeSession(session); 
     } 
     logReturning(resultList); 
     return resultList; 
    } 

    private void logEntered() { 
     log.info(MessageFormat.format("{0}: entered method ''{1}()''", this.getClass().getSimpleName(), getMethodName())); 
    } 

    /** 
    * Get the method name for a depth in call stack. <br /> Utility function 
    * 
    * @param depth depth in the call stack (0 means current method, 1 means 
    * call method, ...) 
    * @return method name 
    */ 
    private static String getMethodName() { 
     final StackTraceElement[] ste = Thread.currentThread().getStackTrace(); 
     return ste[3].getMethodName(); //Thank you Tom Tresansky 
    } 

    private void commit(Transaction tx) { 
     if (tx != null) { 
      log.info("Committing transaction..."); 
      tx.commit(); 
      log.info("Transaction successfully commited."); 
     } 
    } 

    private void handleException(Exception e, Transaction tx) { 
     e.printStackTrace(); 
     if (tx != null) { 
      log.info("rolling back transaction"); 
      tx.rollback(); 
      log.info("transaction successfully rolled back"); 
     } 
    } 

    public void logReturning(Object o) { 
     String returnObject = o != null ? o.getClass().getSimpleName() : null; 
     if (returnObject != null && o instanceof List) { 
      if (((List) o).size() > 0) { 
       returnObject = MessageFormat.format("{0}<{1}>", returnObject, ((List) o).get(0).getClass().getSimpleName()); 
      } 
      returnObject = returnObject + ", total entries: " + ((List) o).size(); 
     } 
     String className = this.getClass().getSimpleName(); 
     log.info(MessageFormat.format("{0}: returning from ''{1}()'' with result of type: {2}", className, getMethodName(), returnObject)); 
    } 

    protected ResultTransformer getQueryResultTransformer() { 
     return null; 
    } 
} 

的入學實體類:

@NamedQueries({ @NamedQuery(name = "getOngoingAdmissions", query = "from Admission a " 
     + "where a.openingDate <= :referenceDate " + "and a.closingDate >= :referenceDate " 
     + "and a.organisationId = :organisationId " + "order by a.openingDate") }) 
@Entity 
@Table(name = "ADMISSION", schema = "SOACOURSE") 
public class Admission implements Serializable { 

    public static final String ADMISSION_TYPE_MANATT = "MANATT"; 
    public static final String ADMISSION_TYPE_DIRATT = "DIRATT"; 
    /* 
    * Column names. 
    */ 
    public static final String COLUMN_ID = "ID"; 
    public static final String COLUMN_ORGANISATION_ID = "ORGANISATION_ID"; 

    public static final String QUERY_ONGOING_ADMISSIONS = "getOngoingAdmissions"; 
    public static final String PARAM_REFERENCE_DATE = "referenceDate"; 
    public static final String PARAM_ORGANISATION_ID = "organisationId"; 
    public static final String PARAM_ID = "id"; 
    private static final long serialVersionUID = 995596202971143170L; 
    /* 
    * Attributes. 
    */ 
    private String id; 
    private String courseId; 
    private int revisionNr; 
    // private CourseExtended courseExtended; 
    private CourseRevision courseRevision; 
    private String name; 
    private String admissionTypeCode; 
    private String description; 
    private Integer admissionType; 
    private Date openingDate; 
    private Date closingDate; 
    private short publish; 
    private Date publishOpeningDate; 
    private Date publishClosingDate; 
    private Integer admissionOfferValidSlot; 
    private Integer admissionOfferSlotSlack; 
    private String infoLink; 
    private short emailVerification; 
    private short emailAttachment; 
    private String emailReply; 
    private String emailSubject; 
    private String emailContent; 
    private Boolean responseRequired; 
    private String information; 
    private String helpLink; 
    private short publishSelfService; 
    private Integer ceiling; 
    private String organisationId; 
    private String productNumber; 
    private Teaching teaching; 
    private Set<AdmissionEmailDocument> admissionEmailDocuments = new HashSet<AdmissionEmailDocument>(0); 
    private Set<Application> applications = new HashSet<Application>(0); 
    private Set<AdmissionSurvey> admissionSurveys = new HashSet<AdmissionSurvey>(0); 
    private Set<AdmissionAlternative> admissionAlternatives = new HashSet<AdmissionAlternative>(0); 
    private Set<AdmissionArticle> admissionArticles = new HashSet<AdmissionArticle>(0); 
    private AdmissionSchemaSettings admissionSchemaSettings; 
    private Set<AdmissionSchemaUpload> admissionSchemaUploads = new HashSet<AdmissionSchemaUpload>(0); 
    private List<AdmissionEmail> admissionEmails = new ArrayList<AdmissionEmail>(0); 
    private Organisation organisation; 

    // private Set<AdmissionTeaching> admissionTeachings = new HashSet<AdmissionTeaching>(0); 
    public Admission() {} 

    @Id 
    @Column(name = "ID", unique = true, nullable = false, length = 28) 
    public String getId() { 
     return this.id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    @Column(name = "COURSE_ID", nullable = false, length = 28) 
    public String getCourseId() { 
     return courseId; 
    } 

    public void setCourseId(String courseId) { 
     this.courseId = courseId; 
    } 

    @Column(name = "REVISION_NR", nullable = false, precision = 3) 
    public int getRevisionNr() { 
     return revisionNr; 
    } 

    public void setRevisionNr(int revisionNr) { 
     this.revisionNr = revisionNr; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "TEACHING_ID") 
    public Teaching getTeaching() { 
     return this.teaching; 
    } 

    public void setTeaching(Teaching teaching) { 
     this.teaching = teaching; 
    } 

    @Column(name = "NAME", nullable = false, length = 250) 
    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Column(name = "ADMISSION_TYPE_CODE", nullable = false, length = 8) 
    public String getAdmissionTypeCode() { 
     return this.admissionTypeCode; 
    } 

    public void setAdmissionTypeCode(String admissionTypeCode) { 
     this.admissionTypeCode = admissionTypeCode != null ? admissionTypeCode : "DIRATT"; 
    } 

    @Column(name = "DESCRIPTION", length = 2000) 
    public String getDescription() { 
     return this.description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    @Column(name = "ADMISSION_TYPE", precision = 1, scale = 0) 
    public Integer getAdmissionType() { 
     return this.admissionType; 
    } 

    public void setAdmissionType(Integer admissionType) { 
     this.admissionType = admissionType; 
    } 

    @Temporal(TemporalType.DATE) 
    @Column(name = "OPENING_DATE", length = 7) 
    public Date getOpeningDate() { 
     return this.openingDate; 
    } 

    public void setOpeningDate(Date openingDate) { 
     this.openingDate = openingDate; 
    } 

    @Temporal(TemporalType.DATE) 
    @Column(name = "CLOSING_DATE", length = 7) 
    public Date getClosingDate() { 
     return this.closingDate; 
    } 

    public void setClosingDate(Date closingDate) { 
     this.closingDate = closingDate; 
    } 

    @Column(name = "PUBLISH", nullable = false, precision = 1, scale = 0) 
    public short getPublish() { 
     return this.publish; 
    } 

    public void setPublish(Short publish) { 
     this.publish = publish != null ? publish : 0; 
    } 

    @Temporal(TemporalType.DATE) 
    @Column(name = "PUBLISH_OPENING_DATE", length = 7) 
    public Date getPublishOpeningDate() { 
     return this.publishOpeningDate; 
    } 

    public void setPublishOpeningDate(Date publishOpeningDate) { 
     this.publishOpeningDate = publishOpeningDate; 
    } 

    @Temporal(TemporalType.DATE) 
    @Column(name = "PUBLISH_CLOSING_DATE", length = 7) 
    public Date getPublishClosingDate() { 
     return this.publishClosingDate; 
    } 

    public void setPublishClosingDate(Date publishClosingDate) { 
     this.publishClosingDate = publishClosingDate; 
    } 

    @Column(name = "ADMISSION_OFFER_VALID_SLOT", precision = 2, scale = 0) 
    public Integer getAdmissionOfferValidSlot() { 
     return this.admissionOfferValidSlot; 
    } 

    public void setAdmissionOfferValidSlot(Integer admissionOfferValidSlot) { 
     this.admissionOfferValidSlot = admissionOfferValidSlot; 
    } 

    @Column(name = "ADMISSION_OFFER_SLOT_SLACK", precision = 2, scale = 0) 
    public Integer getAdmissionOfferSlotSlack() { 
     return this.admissionOfferSlotSlack; 
    } 

    public void setAdmissionOfferSlotSlack(Integer admissionOfferSlotSlack) { 
     this.admissionOfferSlotSlack = admissionOfferSlotSlack; 
    } 

    @Column(name = "INFO_LINK") 
    public String getInfoLink() { 
     return this.infoLink; 
    } 

    public void setInfoLink(String infoLink) { 
     this.infoLink = infoLink; 
    } 

    @Column(name = "EMAIL_VERIFICATION", nullable = false, precision = 1, scale = 0) 
    public short getEmailVerification() { 
     return this.emailVerification; 
    } 

    public void setEmailVerification(Short emailVerification) { 
     this.emailVerification = emailVerification != null ? emailVerification : 0; 
    } 

    @Column(name = "EMAIL_ATTACHMENT", nullable = false, precision = 1, scale = 0) 
    public short getEmailAttachment() { 
     return this.emailAttachment; 
    } 

    public void setEmailAttachment(Short emailAttachment) { 
     this.emailAttachment = emailAttachment != null ? emailAttachment : 0; 
    } 

    @Column(name = "EMAIL_REPLY") 
    public String getEmailReply() { 
     return this.emailReply; 
    } 

    public void setEmailReply(String emailReply) { 
     this.emailReply = emailReply; 
    } 

    @Column(name = "EMAIL_SUBJECT") 
    public String getEmailSubject() { 
     return this.emailSubject; 
    } 

    public void setEmailSubject(String emailSubject) { 
     this.emailSubject = emailSubject; 
    } 

    @Column(name = "EMAIL_CONTENT", length = 2000) 
    public String getEmailContent() { 
     return this.emailContent; 
    } 

    public void setEmailContent(String emailContent) { 
     this.emailContent = emailContent; 
    } 

    @Column(name = "RESPONSE_REQUIRED", precision = 1, scale = 0) 
    public Boolean getResponseRequired() { 
     return this.responseRequired; 
    } 

    public void setResponseRequired(Boolean responseRequired) { 
     this.responseRequired = responseRequired; 
    } 

    @Column(name = "INFORMATION", length = 2000) 
    public String getInformation() { 
     return this.information; 
    } 

    public void setInformation(String information) { 
     this.information = information; 
    } 

    @Column(name = "HELP_LINK") 
    public String getHelpLink() { 
     return this.helpLink; 
    } 

    public void setHelpLink(String helpLink) { 
     this.helpLink = helpLink; 
    } 

    @Column(name = "PUBLISH_SELF_SERVICE", nullable = false, precision = 1, scale = 0) 
    public short getPublishSelfService() { 
     return this.publishSelfService; 
    } 

    public void setPublishSelfService(Short publishSelfService) { 
     this.publishSelfService = publishSelfService != null ? publishSelfService : 0; 
    } 

    @Column(name = "CEILING", precision = 4, scale = 0) 
    public Integer getCeiling() { 
     return this.ceiling; 
    } 

    public void setCeiling(Integer ceiling) { 
     this.ceiling = ceiling; 
    } 

    @Column(name = "ORGANISATION_ID", length = 28) 
    public String getOrganisationId() { 
     return this.organisationId; 
    } 

    public void setOrganisationId(String organisationId) { 
     this.organisationId = organisationId; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "admission") 
    public Set<AdmissionEmailDocument> getAdmissionEmailDocuments() { 
     return this.admissionEmailDocuments; 
    } 

    public void setAdmissionEmailDocuments(Set<AdmissionEmailDocument> admissionEmailDocuments) { 
     this.admissionEmailDocuments = admissionEmailDocuments; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "admission") 
    public Set<Application> getApplications() { 
     return this.applications; 
    } 

    public void setApplications(Set<Application> applications) { 
     this.applications = applications; 
    } 

    // @OneToMany(fetch = FetchType.LAZY, mappedBy = "admission") 
    // public Set<AdmissionTeaching> getAdmissionTeachings() { 
    // return this.admissionTeachings; 
    // } 
    // 
    // public void setAdmissionTeachings(Set<AdmissionTeaching> admissionTeachings) { 
    // this.admissionTeachings = admissionTeachings; 
    // } 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "admission") 
    public Set<AdmissionSurvey> getAdmissionSurveys() { 
     return this.admissionSurveys; 
    } 

    public void setAdmissionSurveys(Set<AdmissionSurvey> admissionSurveys) { 
     this.admissionSurveys = admissionSurveys; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "admission") 
    @OrderBy(AdmissionAlternative.PROPERTY_SORT_ORDER + " ASC") 
    public Set<AdmissionAlternative> getAdmissionAlternatives() { 
     return this.admissionAlternatives; 
    } 

    public void setAdmissionAlternatives(Set<AdmissionAlternative> admissionAlternatives) { 
     this.admissionAlternatives = admissionAlternatives; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "admission") 
    public Set<AdmissionArticle> getAdmissionArticles() { 
     return this.admissionArticles; 
    } 

    public void setAdmissionArticles(Set<AdmissionArticle> admissionArticles) { 
     this.admissionArticles = admissionArticles; 
    } 

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "admission") 
    public AdmissionSchemaSettings getAdmissionSchemaSettings() { 
     return this.admissionSchemaSettings; 
    } 

    public void setAdmissionSchemaSettings(AdmissionSchemaSettings admissionSchemaSettings) { 
     this.admissionSchemaSettings = admissionSchemaSettings; 
    } 

    // @ManyToOne(fetch = FetchType.LAZY) 
    // @JoinColumns({ 
    // @JoinColumn(name = "COURSE_ID", referencedColumnName = "COURSE_ID", insertable = false, 
    // updatable = false), 
    // @JoinColumn(name = "REVISION_NR", referencedColumnName = "REVISION_NR", insertable = false, 
    // updatable = false) 
    // }) 
    // public CourseExtended getCourseExtended() { 
    // return this.courseExtended; 
    // } 
    // 
    // public void setCourseExtended(CourseExtended courseExtended) { 
    // this.courseExtended = courseExtended; 
    // } 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumns({ 
      @JoinColumn(name = "COURSE_ID", referencedColumnName = "COURSE_ID", nullable = false, insertable = false, updatable = false), 
      @JoinColumn(name = "REVISION_NR", referencedColumnName = "REVISION_NR", nullable = false, insertable = false, updatable = false) }) 
    public CourseRevision getCourseRevision() { 
     return this.courseRevision; 
    } 

    public void setCourseRevision(CourseRevision courseRevision) { 
     this.courseRevision = courseRevision; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "admission") 
    public Set<AdmissionSchemaUpload> getAdmissionSchemaUploads() { 
     return admissionSchemaUploads; 
    } 

    public void setAdmissionSchemaUploads(Set<AdmissionSchemaUpload> admissionSchemaUploads) { 
     this.admissionSchemaUploads = admissionSchemaUploads; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = AdmissionEmail.PROPERTY_ADMISSION) 
    public List<AdmissionEmail> getAdmissionEmails() { 
     return admissionEmails; 
    } 

    public void setAdmissionEmails(List<AdmissionEmail> admissionEmails) { 
     this.admissionEmails = admissionEmails; 
    } 

    @Transient 
    public boolean isDiratt() { 
     return ADMISSION_TYPE_DIRATT.equals(admissionTypeCode); 
    } 

    @Transient 
    public boolean isManatt() { 
     return ADMISSION_TYPE_MANATT.equals(admissionTypeCode); 
    } 

    @Column(name = "PRODUCT_NUMBER", length = 32) 
    public String getProductNumber() { 
     return productNumber; 
    } 

    public void setProductNumber(String productNumber) { 
     this.productNumber = productNumber; 
    } 

    @OneToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = COLUMN_ORGANISATION_ID, referencedColumnName = Organisation.COLUMN_ADDRESS_OWNER_ID, insertable = false, updatable = false) 
    public Organisation getOrganisation() { 
     return organisation; 
    } 

    public void setOrganisation(Organisation organisation) { 
     this.organisation = organisation; 
    } 
} 

我不知道爲什麼它的失敗當殼體是正確的。或者我可能忽略了一些東西。我希望有人能幫幫忙。

謝謝!

編輯

我忘了提,它已經在過去的幾年版本工作,昨天但不是今天它的工作。

+0

你有沒有任何堆棧跟蹤?查詢中的「+」非常難以閱讀。 –

+0

您使用別名「left join fetch a.courseRevision cr」,但不要在查詢的其餘部分使用它。 我現在無法測試,但也許可能是因爲這個原因?編輯:實際上,你使用它在連接,但不是在哪裏 – VLef

+0

@VLef這個別名是用來通過連接或子選擇來獲取關聯。 –

回答

0

看起來像一個問題,這個

sb.append("lower(a.courseRevision.course.code) like lower(:searchPhrase)"); 

不能使用a.courseRevision.course.code,因爲你沒有a.courseRevision別名。

也許c.code

+0

和a.courseRevision有一個別名:cr – triForce420

+0

@ triForce420但是'cr.course c' –

相關問題