Hibernate 示例条件休眠多连接/表SQL
我有一个SQL查询Hibernate 示例条件休眠多连接/表SQL,hibernate,jpa,ejb,criteria,Hibernate,Jpa,Ejb,Criteria,我有一个SQL查询 select pr.*,p.id, cf.nome, p.valor_total as "valor total", f.descricao as "forma de pagamento", t.descricao as "tipo de pagamento", s.descricao as "Status" from pedido p left join cliente c on c.id = p.id_cliente left join cliente_p
select pr.*,p.id, cf.nome, p.valor_total as "valor total", f.descricao as "forma de pagamento", t.descricao as "tipo de pagamento", s.descricao as "Status" from pedido p
left join cliente c on c.id = p.id_cliente
left join cliente_pessoa_fisica cf on cf.id_cliente = c.id
left join forma_pagamento f on f.id = p.id_forma_pagamento
left join tipo_pagamento t on t.id = p.id_tipo_pagamento
left join status_pedido s on s.id = p.id_status_pedido
left join itempedido itp on itp.id_pedido = p.id
left join produto pr on pr.id = itp.id_produto
如何使用此查询生成标准Hibernate SQL?这是我的最佳选择,类的名称可能不同
CriteriaBuilder qb = entityMan.getCriteriaBuilder();
CriteriaQuery<Pedido> criteriaQuery = qb.createQuery(Pedido.class);
Root<Pedido> root = criteriaQuery.from(Pedido.class);
/**
* if the Cliente is a list you should use ListJoin instead of Join so it's ListJoin<Pedido, Cliente>
*if you don't have metadata you can use root.join(root.get("id_cliente")).
*/
Join<Pedido, Cliente> cliente = root.join(Pedido_.id_cliente, JoinType.LEFT);
Join<Cliente, ClientePessoaFisica> clientePessoaFisica = cliente.join(Cliente_.id, JoinType.LEFT);//or if you don't have metadata you can use root.join(cliente.get("id_cliente"))
Join<Pedido, FormaPagamento> formaPagamento = root.join(Pedido_.id_forma_pagamento, JoinType.LEFT); //or if you don't have metadata you can use root.join(root.get("id_forma_pagamento"))
Join<Pedido, TipoPagamento> tipoPagamento = root.join(Pedido_.id_tipo_pagamento, JoinType.LEFT);//or if you don't have metadata you can use root.join(root.get("id_tipo_pagamento"))
Join<Pedido, StatusPedido> statusPedido = root.join(Pedido_.id_status_pedido, JoinType.LEFT);//or if you don't have metadata you can use root.join(root.get("id_status_pedido"))
Join<Pedido, Itempedido> itempedido = root.join(Pedido_.id, JoinType.LEFT);//or if you don't have metadata you can use root.join(root.get("id"))
Join<Itempedido, Produto> produto = itempedido.join(Itempedido_.id_produto, JoinType.LEFT);//or if you don't have metadata you can use root.join(itempedido.get("id_produto"))
/**
* Here you can select what ever you want, here's an example and you can complete it yourself :)
* But I would remove this line and select the object itself Pedido
* Now it depends on you FetchType of the relationships, you might need fetch join
*/
criteriaQuery.multiselect(root.get("id"), root.get("valor_total"), formaPagamento.get("descricao"));
TypedQuery<Pedido> query = entityMan.createQuery(criteriaQuery);
return query.getResultList();
CriteriaBuilder qb=entityMan.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=qb.createQuery(Pedido.class);
Root=criteriaQuery.from(Pedido.class);
/**
*如果客户是一个列表,您应该使用ListJoin而不是Join,因此它是ListJoin
*如果没有元数据,可以使用root.join(root.get(“id\u cliente”))。
*/
Join cliente=root.Join(Pedido.id\u cliente,JoinType.LEFT);
Join clientePessoaFisica=cliente.Join(cliente_.id,JoinType.LEFT)//或者,如果没有元数据,可以使用root.join(cliente.get(“id\u cliente”))
Join formapagmento=root.Join(Pedido.id\u forma\u pagmento,JoinType.LEFT)//或者,如果没有元数据,可以使用root.join(root.get(“id\u forma\u pagamento”))
Join-tipopagato=root.Join(Pedido_u.id_-tipo_-pagamento,JoinType.LEFT)//或者,如果没有元数据,可以使用root.join(root.get(“id\u tipo\u pagamento”))
Join statusPedido=root.Join(Pedido.id\u status\u Pedido,JoinType.LEFT)//或者,如果您没有元数据,可以使用root.join(root.get(“id\u status\u pedido”))
Join itempedido=root.Join(Pedido.id,JoinType.LEFT)//或者,如果没有元数据,可以使用root.join(root.get(“id”))
Join-produto=itempedido.Join(itempedido.id\u-produto,JoinType.LEFT)//或者,如果没有元数据,可以使用root.join(itempedido.get(“id\u produto”))
/**
*在这里,你可以选择任何你想要的,这里有一个例子,你可以自己完成:)
*但我会删除这条线并选择对象本身
*现在,这取决于关系的类型,您可能需要fetchjoin
*/
criteriaQuery.multiselect(root.get(“id”)、root.get(“valor_total”)、formaPagamento.get(“descripao”);
TypedQuery=entityMan.createQuery(criteriaQuery);
返回query.getResultList();
到目前为止你都尝试了什么?伙计,这很有帮助!!谢谢!