我试图在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中它不起作用。有什么帮助吗?
感谢。
答案 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
。