2012-10-19 9 views
5

Etki alanı modelimde fazladan bir sütunla çoktan çoğa ilişkisi uygulamak için bunu tutorial izledim. Harika çalışıyor ancak ilişkimin sol tarafında bir alanı sorgulamak için bir kriter oluşturamıyorum.Fazladan çoktan fazladan sınıflandırma ölçütüyle ilgili sorunları bekletme

bu kodu alarak istediğim

 @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; 
     } 
} 

istenen adla bir organization olan bir Project seçmek için bir ölçüt oluşturmaktır. Bu kodu çalıştırmak

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

ama bu hata var

2012-10-19 10: 38: 43.095 HATA [org.hibernate.util.JDBCExceptionReporter] Bilinmeyen sütun 'organizati2_.name' hazırda tarafından üretilen 'nerede şartı'

ve sql sorgusunda eksik, .. organization.id ile projects_has_organizations.organization katılmazsa yüzden kolon organization.name

bulamıyorum
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 

Bu kodun nesi yanlış? Ölçütleri kullanarak sorguyu nasıl oluşturabilirim?

cevap

0

Sorunun tembel getirme nedeniyle olduğundan şüpheleniyorum, açık bir şekilde ihtiyacınız olan özelliği hevesle getirmeye hazırda bekletmeyi deneyin. Bu dinamik benim sorgu oluşturmak için TorpedoQuery kütüphanesinin desteğiyle, Başka türlü ifade içinde, sonunda kullanılan HQL sorgu benim sorunu çözmek için hevesle deneyin organizasyon özelliğini :)

+0

getirme

.setFetchMode("propertyName", FetchMode.EAGER) 

Yani yöntemle yapılır . –

İlgili konular