加入 CriteriaQuery?

问题描述 投票:0回答:1

我正在尝试使用 CriteriaQuery 进行 JOIN 来获取数据库信息,但返回有关无法解析属性的异常,并且不起作用。我正在寻找解决方案,但还没有找到。 我的代码如下:

@Entity
@Table(name="cargo")
public class Cargo implements Serializable{
    private static final long serialVersionUID = 1L;

    @Id @GeneratedValue
    private Integer idCargo;    

    @NotNull @NotEmpty @Column(unique=true) 
    private String cargo;
}


@Entity
@Table(name="curriculum")
public class Curriculum implements Serializable{
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue
    private Long idCurriculum;
    
    @Transient @OneToOne @JoinColumn(name="idCurriculum")
    private Curriculum curriculum;
    
    @Temporal(TemporalType.DATE)
    private Date dataCad;
    
    
    
    @Size(min=5, max=50)
    @NotNull
    @NotEmpty   
    private String nome;
        
    @NotEmpty
    private String sexo;
    
    @Email
    @NotEmpty
    @NotNull
    @Size(max=250)
    @Column(unique=true)
    private String email;
    
    @NotNull
    @NotEmpty
    @Size(min=14, max=14)
    @Column(unique=true)
    private String cpf;
    
    @NotEmpty
    @NotNull
    @Size(min=8, max=8)
    private String senha;
        
    @OneToOne//(cascade = CascadeType.ALL)
    @NotNull
    @JoinColumn(name="idCargo")
    private Cargo cargo;
    
    private String ativado = "N";
}


@Entity
@Table(name="curriculum2")
public class Curriculum2 implements Serializable{
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue
    private Long idC2; //NOT NULL AUTO_INCREMENT,
    
    @NotNull @OneToOne(cascade=CascadeType.ALL,orphanRemoval=true) 
    @JoinColumn(name="idCurriculum")    
    private Curriculum curriculum; //NOT NULL,
    
    @NotNull @Temporal(TemporalType.DATE)
    private Date dataNasceu; //NOT NULL,
    
    @NotNull @NotEmpty @Size(min=5, max=50)
    private String cidade; //` varchar(50) NOT NULL,
    
    @NotNull @NotEmpty @Size(min=5, max=50)
    private String endereco; //` varchar(50) NOT NULL,
    
    @NotNull 
    private int numero; //` int(11) NOT NULL,
    
    @NotNull @NotEmpty @Size(min=5, max=50)
    private String bairro; //` varchar(50) NOT NULL,
    
    
    private String complemento;
    
    //14.790-000
    private String cep;
        
    private String estado;
    
    
    private String fone; //varchar(15)
    
    
    private String celular;
    
    
    private String pai;
    
    @NotNull @NotEmpty @Size(min=5, max=50)
    private String mae;//NOT NULL,
    
    @NotNull @NotEmpty @Size(min=5, max=50)
    private String nacionalidade; // NOT NULL,
    
    @NotNull @NotEmpty @Size(min=5, max=50)
    private String naturalidade; //NOT NULL,
    
    @NotNull @NotEmpty @Size(min=5, max=50)
    private String estcivil; //NOT NULL,
    
    
    private String rg;
    
    @NotNull @NotEmpty @Size(min=5, max=20)
    private String cartprof; //NOT NULL,
    
    @NotNull @NotEmpty @Size(min=2, max=20)
    private String serie; //NOT NULL,
    
    
    private String reservista; 
    private String titeleitor;
    private String zona;
    private String carthabilita;
    private String categoria;
    private BigDecimal ultimosalario;
    
    @NotNull @NotEmpty @Size(min=5, max=50)
    private String salariopretendido; //not null
    
    private String observacoes;    
}


@Entity
@Table(name="escolaridade")
public class Escolaridade implements Serializable{
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue
    private Integer idEscola;
    
    @NotNull @NotEmpty @Size(min=5,max=50)
    private String escola;
    
    @NotNull @NotEmpty @Size(min=5,max=50)
    private String cidade;
    
    @NotNull
    private String estado;
    
    @NotNull @Temporal(TemporalType.DATE)
    private Date inicio;
    
    @Temporal(TemporalType.DATE)
    private Date conclusao;
    
    @NotNull 
    private String ensino;

    @NotNull @OneToOne @JoinColumn(name="idCurriculum")
    private Curriculum curriculum;
}


@Entity
@Table(name="experiencia")
public class Experiencia implements Serializable{
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue
    private Integer idExperiencia;  
    @NotNull @NotEmpty @Size(min=5,max=50)
    private String empresa; 
    @NotNull @NotEmpty @Size(min=5,max=50)
    private String endereco;    
    @NotNull @NotEmpty @Size(min=5,max=50)
    private String cidade;  
    @NotNull @NotEmpty @Size(min=5,max=50)
    private String bairro;  
    @NotNull @NotEmpty
    private String estado;      
    @NotNull @Temporal(TemporalType.DATE) 
    private Date entrada;   
    @Temporal(TemporalType.DATE)
    private Date saida; 
    @NotNull @NotEmpty @Size(min=5,max=50)
    private String cargo;   
    private String funcoesDesemp;   
    private String fone;
    private String nomeEncarregado; 
    @NotNull @OneToOne @JoinColumn(name="idCurriculum")
    private Curriculum curriculum;
}

@Entity
@Table(name="aperfeicoamento")
public class Aperfeicoamento implements Serializable{
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue
    private Integer idAperfeicoamento;
    
    @NotNull @NotEmpty @Size(min=5, max=50)
    private String aperfeicoamento;
    
    @NotNull @NotEmpty @Size(min=5, max=50)
    private String entidadeensino;
    
    @NotNull @NotEmpty @Size(min=5, max=50)
    private String cidade;
    
    @NotNull 
    private String estado;
    
    @NotNull @Temporal(TemporalType.DATE)
    private Date inicio;
    
    @Temporal(TemporalType.DATE)
    private Date conclusao;
    
    @OneToOne 
    @JoinColumn(name="idCurriculum")    
    private Curriculum curriculum;
}


//return List<Curriculum>
public List<Curriculum> getCurriculumReport(Long id){
        List<Curriculum> lista = new ArrayList<Curriculum>();
        
        EntityManager em = datasource.getEntityProvider().getEntityManager();       
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Curriculum> c = cb.createQuery(Curriculum.class);        
        Root<Curriculum> root = c.from(Curriculum.class);
        Join<Curriculum, Cargo> joinCCargo = root.join("curriculum");
        Join<Curriculum, Curriculum2> joinCC2 = root.join("curriculum");
        Join<Curriculum, Escolaridade> joinCE = root.join("curriculum");
        Join<Curriculum, Aperfeicoamento> joinCA = root.join("curriculum");
        Join<Curriculum, Experiencia> joinCExp = root.join("curriculum");
        
        c.where(cb.equal(joinCCargo.get("idCurriculum"), cb.parameter(Long.class, "id")));
        TypedQuery q = em.createQuery(c);
        q.setParameter("id", id);
        
        lista = q.getResultList();
        
        return lista;
    }


//Exception returns
Caused by: java.lang.IllegalArgumentException: Unable to resolve attribute [curriculum] against path
    at org.hibernate.ejb.criteria.path.AbstractPathImpl.unknownAttribute(AbstractPathImpl.java:120)
    at org.hibernate.ejb.criteria.path.AbstractPathImpl.locateAttribute(AbstractPathImpl.java:229)
    at org.hibernate.ejb.criteria.path.AbstractFromImpl.join(AbstractFromImpl.java:411)
    at org.hibernate.ejb.criteria.path.AbstractFromImpl.join(AbstractFromImpl.java:397)
    at br.ind.ibg.dao.RelatorioDAO.getCurriculumReport(RelatorioDAO.java:33)
    at br.ind.ibg.reports.Report.<init>(Report.java:23)
    at br.ind.ibg.views.ViewCurriculum.buttonClick(ViewCurriculum.java:413)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:508)
    ... 37 more

有什么想法吗?

java jpa criteria-api vaadin7
1个回答
0
投票

根据您的实体类,这没有意义。

    Join<Curriculum, Cargo> joinCCargo = root.join("curriculum");

root
的类型是
Curriculum
,它确实有
curriculum
属性,但该属性的类型不是
Cargo
,而是
Curriculum

这看起来就是你想要的。

    Join<Curriculum, Cargo> joinCCargo = root.join("cargo");

-- 编辑-- 其他协会依此类推。如果您需要加入未映射的实体,那么最好的解决方案是映射该实体。将

Experiencia
对象的集合映射到属性名称为“experienciaList”的
Curriculum
类,然后通过执行

将其加入到查询中
   root.join("experienciaList");

Hibernate 将知道如何连接表,因为您的映射将定义它。

此外,当您想使用这些命名的 Join 对象对查询某些内容创建限制时,您实际上只需要创建它们。如果您只想告诉 Hibernate 获取关联,只需执行此操作即可。

   root.join("cargo").join("foo").join("bar");
© www.soinside.com 2019 - 2024. All rights reserved.