2012-10-19 14 views
5

Ho seguito questo tutorial per implementare nel mio modello di dominio una relazione molti-a-molti con una colonna aggiuntiva. Funziona alla grande ma non riesco a creare un criterio per interrogare un campo nella parte sinistra della mia relazione.Hibernate many-to-many con problemi con criteri extracolumn

Prendendo questo codice

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

che voglio è quello di creare un criterio per selezionare un Project che ha un organization con un nome richiesto.

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

Ma quando ho eseguito questo codice ho questo errore

2012-10-19 10: 38: 43.095 ERRORE [org.hibernate.util.JDBCExceptionReporter] Unknown column 'organizati2_.name' in 'clausola where'

e la query SQL generato da Hibernate è incompleta, non unirsi projects_has_organizations.organization con organization.id .. Quindi non è possibile trovare colonna 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 

Cosa c'è di sbagliato con questo codice? Come posso costruire una query usando i criteri?

risposta

0

Sospetto che il problema sia dovuto al recupero pigro, provare esplicitamente a mettere in letargo la funzione di recupero della proprietà di cui si ha bisogno. Questo viene fatto con il metodo

.setFetchMode("propertyName", FetchMode.EAGER) 

Così, in altri termini, provo con entusiasmo prendere la proprietà dell'organizzazione :)

+0

ho interrogazione HQL finalmente usato per risolvere il mio problema, con il supporto della libreria TorpedoQuery per creare dinamicamente mia domanda . –

Problemi correlati