Hibernate中的内部联接查询出错

时间:2017-06-14 14:35:26

标签: hibernate jpa hql

我试图在JSF项目中执行Hibernate查询,但我收到此错误消息:

Caused by: org.hibernate.QueryException: could not resolve property: agencia of: entity.Conta

这是我的查询方法:

public static Conta procurarSenha(String agencia, String conta, String cpf) {
    EntityManagerFactory factory = Persistence.createEntityManagerFactory("BANCO");
    EntityManager em = factory.createEntityManager();
    try {
        TypedQuery<Conta> query = em.createQuery("SELECT con from Conta c INNER JOIN c.usuario u ON c.USER_CPF = u.cpf "
                + "WHERE c.agencia = :ag AND c.conta = :ct AND u.cpf = :cp", Conta.class);
        query.setParameter("ag", agencia);
        query.setParameter("ct", conta);
        query.setParameter("cp", cpf);
        List<Conta> contas = query.getResultList();
        em.clear();
        em.close();
        factory.close();
        if (contas != null && contas.size() > 0) {
            return contas.get(0);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

这里是Conta类:

@Entity
public class Conta {
@EmbeddedId
private DadosConta contaUsuario = new DadosConta();
private String senha;
private String tipoConta;
private double saldo;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="USER_CPF", unique= true, nullable=false, insertable=true, 
updatable=true)
private Usuario usuario = new Usuario();
@OneToMany(mappedBy="contaOrigem", fetch = FetchType.LAZY)
private List<Transacao> transacoes = new ArrayList<>();
... getters and setters

这里是DadosConta(嵌入式ID)类:

@Embeddable
public class DadosConta {
private String agencia;
private String conta;
...getters and setters

这是Usuario课程:

@Entity
@Table(name = "usuario")
public class Usuario {

private String nome;
private String cpf;
private String rg;
private Date dataNasc;
private String telefone;
private String email;
private String logradouro;
private String numero;
private String cep;
...getters and setters

当我查询其中一个时,没有内部连接,它可以正常工作,但是当我查询这些类之间的连接时,它会显示错误消息。这个查询在MySQL中是正确的,但在Hibernate中它不起作用。有什么帮助吗?

感谢。

2 个答案:

答案 0 :(得分:0)

您可以尝试以下查询:

SELECT con from Conta c INNER JOIN c.usuario u WHERE   
c.contaUsuario.agencia = :ag AND c.conta = :ct AND u.cpf = :cp

您的CompoundedKey在变量名称 contaUsuario 中引用,因此您必须通过它。

同样如微小提到的那样,当你在编写JPQL而不是SQL时,你不能使用INNER JOIN

答案 1 :(得分:0)

您正在查找课程agencia中的字段conta。您无需查询c.agencia,而是需要查询c.contaUsuario.agencia