2012-10-19 25 views
5

मैंने अपने डोमेन मॉडल में लागू करने के लिए tutorial का पालन किया ताकि अतिरिक्त कॉलम के साथ कई से अधिक रिश्तों को लागू किया जा सके। यह बहुत अच्छा काम करता है लेकिन मैं अपने संबंध के बाईं ओर एक क्षेत्र से पूछताछ करने के लिए मानदंड बनाने में असमर्थ हूं।हाइबरनेट कई से अधिक बुद्धिमान मानदंड मानदंड

इस कोड को ले रहा है

 @Entity 
     @Table(name = "projects") 
     public class Project implements Cloneable, Serializable{ 

      private Long id; 
      private String name; 
      private Set<ProjectOrganization> projectOrganizations = new HashSet<ProjectOrganization>(0); 

      @Id 
      @GeneratedValue(strategy = GenerationType.AUTO) 
      @Column(nullable = false) 
      public Long getId() { 
       return this.id; 
      } 


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


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


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


      @OneToMany(fetch = FetchType.EAGER, mappedBy = "pk.project") 
      @Cascade(value = { CascadeType.ALL }) 
      public Set<ProjectOrganization> getProjectOrganizations() { 
       return this.projectOrganizations; 
      } 


      public void setProjectOrganizations(Set<ProjectOrganization> organizationProjects) { 
       this.projectOrganizations = organizationProjects; 
      } 

     } 





    @Entity 
    @Table(name = "projects_has_organizations") 
    @AssociationOverrides({ @AssociationOverride(name = "pk.project", joinColumns = @JoinColumn(name = "projects_id")), 
          @AssociationOverride(name = "pk.organization", joinColumns = @JoinColumn(name = "organizations_id")) 
          }) 
    public class ProjectOrganization implements Cloneable, Serializable { 


     private ProjectOrganizationPK pk = new ProjectOrganizationPK(); 
     private OrganizationRolesEnum role; 

     public ProjectOrganization() { 
     } 

     @Transient 
     public Organization getOrganization() { 
      return getPk().getOrganization(); 
     } 

     public void setOrganization(Organization organization) { 
      getPk().setOrganization(organization); 
     } 

     @EmbeddedId 
     public ProjectOrganizationPK getPk() { 
      return pk; 
     } 

     public void setPk(ProjectOrganizationPK pk) { 
      this.pk = pk; 
     } 

     @Transient 
     public Project getProject() { 
      return getPk().getProject(); 
     } 

     public void setProject(Project project) { 
      getPk().setProject(project); 
     } 

     @Enumerated(EnumType.STRING) 
     @Column(nullable = false, length = 50) 
     public OrganizationRolesEnum getRole() { 
      return role; 
     } 

     public void setRole(OrganizationRolesEnum role) { 
      this.role = role; 
     } 

    } 

    @Embeddable 
    public class ProjectOrganizationPK implements Cloneable, Serializable { 

     /** Generated serial version UID */ 
     private static final long serialVersionUID = -4534322563105003365L; 

     private Organization organization; 
     private Project project; 

     @ManyToOne 
     public Organization getOrganization() { 
      return organization; 
     } 

     public void setOrganization(Organization organization) { 
      this.organization = organization; 
     } 

     @ManyToOne 
     public Project getProject() { 
      return project; 
     } 

     public void setProject(Project project) { 
      this.project = project; 
     } 
    } 

    @Entity 
    @Table(name = "organizations") 
    public class Organization implements Cloneable, Serializable { 

     private Long id; 
     private String name; 
     private Set<ProjectOrganization> projectOrganizations = new HashSet<ProjectOrganization>(0); 

     public Organization() { 
     } 


     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     @Column(nullable = false) 
     @Override 
     public Long getId() { 
      return this.id; 
     } 

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

     @Column(name = "name", nullable = false, length = 255) 
     @NotNull(message = "A name is required!") 
     public String getName() { 
      return this.name; 
     } 

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


     @OneToMany(fetch = FetchType.EAGER, mappedBy = "pk.organization") 
     public Set<ProjectOrganization> getProjectOrganization() { 
      return this.projectOrganizations; 
     } 


     public void setProjectOrganization(Set<ProjectOrganization> projectOrganizations) { 
      this.projectOrganizations = projectOrganizations; 
     } 
} 

मैं चाहता हूँ एक Project जो एक अनुरोध किया नाम के साथ एक organization है का चयन करने के लिए एक मापदंड तैयार करना है।

final Criteria crit = getSession().createCriteria(Project.class); 
crit.createCriteria("projectOrganizations", "projectOrganization"). 
createAlias("pk.organization", "organization"). 
    add(Restrictions.like("organization.name", "TEST")); 

लेकिन मैं यह त्रुटि है जब मैं इस कोड को चलाने

2012-10-19 10: 38: 43,095 त्रुटि [org.hibernate.util.JDBCExceptionReporter] अज्ञात स्तंभ 'organizati2_.name' में 'जहां खंड'

और एसक्यूएल क्वेरी हाइबरनेट द्वारा उत्पन्न अधूरा है, .. साथ organization.id projects_has_organizations.organization में शामिल होने नहीं करता है तो यह कॉलम organization.name

नहीं मिल सकता है
SELECT 
    .... 
FROM 
    projects this_ 
INNER JOIN projects_has_organizations projectorg1_ ON this_.id = projectorg1_.projects_id 
WHERE 
    projectorg1_.role =? 
AND organizati2_. NAME LIKE ? 
ORDER BY 
    this_.publish_date DESC 

इस कोड के साथ क्या गलत है? मैं मानदंडों का उपयोग कर क्वेरी कैसे बना सकता हूं?

उत्तर

0

मुझे संदेह है कि समस्या आलसी लाने के कारण है, स्पष्ट रूप से हाइबरनेट को अपनी संपत्ति की उत्सुकता से लाने के लिए कहें। इस विधि के साथ किया जाता

.setFetchMode("propertyName", FetchMode.EAGER) 

तो,, TorpedoQuery पुस्तकालय के समर्थन गतिशील मेरी क्वेरी बनाने के साथ otherwords में, बेसब्री से कोशिश संगठन संपत्ति :)

+0

लाने मैं अंत में इस्तेमाल किया HQL क्वेरी मेरी समस्या को हल करने । –

संबंधित मुद्दे