Hibernate 中的内部连接查询出错

Error with Inner Join query in Hibernate

我正在尝试在 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 class:

@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)class:

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

这是 Usuario class:

@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

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

谢谢。

您可以尝试以下查询:

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 中被引用,因此您必须通过它。

另外,正如 tiny 所提到的,您不能在编写 JPQL 时使用 INNER JOIN wih ON,而不是 SQL

您正在 class conta 中查找字段 agencia。您需要查询 c.contaUsuario.agencia.

而不是查询 c.agencia