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