2012-10-19 10 views
5

Postępowałem zgodnie z tym tutorial, aby zaimplementować w moim modelu domeny relację wiele do wielu z dodatkową kolumną. Działa wspaniale, ale nie jestem w stanie stworzyć kryteriów wyszukiwania pól w lewej części relacji.Hibernacja wiele-do-wielu z problemami z kryteriami extracolumn

Biorąc ten kod

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

chcę jest stworzenie kryteriów, aby wybrać Project który ma organization z żądanej nazwy.

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

Ale gdy uruchamiam ten kod mam ten błąd

2012-10-19 10: 38: 43.095 ERROR [org.hibernate.util.JDBCExceptionReporter] Nieznany kolumna 'organizati2_.name' in „where clause”

i zapytania sQL generowane przez hibernacji jest niekompletna, nie przyłączyć projects_has_organizations.organization z organization.id .. Więc to nie może znaleźć kolumnie 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 

Co jest nie tak z tym kodem? Jak mogę utworzyć zapytanie przy użyciu kryteriów?

Odpowiedz

0

Podejrzewam, że problem wynika z leniwego pobierania, spróbuj jawnie nakazać hibernacji, aby z niecierpliwością pobierał żądaną usługę. Odbywa się to za pomocą metody

.setFetchMode("propertyName", FetchMode.EAGER) 

Więc w otherwords, spróbuj pobrać z niecierpliwością Organizacji Własności :)

+0

końcu wykorzystane HQL zapytania, aby rozwiązać mój problem, przy wsparciu biblioteki TorpedoQuery dynamicznie budować moje zapytanie . –

Powiązane problemy