使用JPA标准连接没有关系的表

ocebsuys  于 2023-11-18  发布在  其他
关注(0)|答案(4)|浏览(126)

我有两个没有模型关系的表:
comm,列为:

name
date
code

字符串
persondesc,列:

code
description


两个表之间的关系是多对一(多对一persondesc):

com.code = persondesc.code

这两个表用注解Map,但我没有声明关系。
我尝试的是选择persondesc.description排序的comm表。
我该怎么做JPA和Hibernate?

oxosxuxt

oxosxuxt1#

因此,如果您的类没有“关系”,那么您可以执行如下查询:

SELECT a FROM A a
CROSS JOIN B b
WHERE a.someField = b.otherField
ORDER BY b.anotherField

字符串
可以使用JPA标准来实现,* 类似于 *

CriteriaBuilder cb = emf.getCriteriaBuilder();
CriteriaQuery<A> query = cb.createQuery(A.class);
Root<A> aRoot = query.from(A.class);
Root<B> bRoot = query.from(B.class);
aRoot.alias("a");
bRoot.alias("b");

query.select(aRoot)
  .where(cb.equal(aRoot.get(A_.someField), bRoot.get(B_.otherField))
  .orderBy(cb.asc(bRoot.get(B_.anotherField)));


或者只是重新设计你的类,帮你的开发人员一个忙。

ffdz8vbo

ffdz8vbo2#

Hibernate 5.1为JPQL引入了对无关实体的显式连接。所以现在你可以像原生SQL一样编写JOIN

List<Comm> results = entityManager
  .createQuery("""SELECT c FROM Comm c
    JOIN PersonDesc pd ON c.code = pd.code
    ORDER BY pd.description""", Comm.class)
  .getResultList();

字符串
单击here查看更详细的示例。

ws51t4hk

ws51t4hk3#

你可以通过使用Subquery. Example对persondesc.description进行“like”操作来实现

Subquery<persondesc> subquery = query.subquery(persondesc.class);
Root<persondesc> subRoot = subquery.from(persondesc.class);
subquery.select(subRoot.get("code"));

Predicate likeDescriptionPr = cr.like(subRoot.get("name"), "%" + searchTerm + "%")
subquery.where(likeDescriptionPr);
Predicate joinPredicate = cr.in(root.get("code")).value(subquery);

字符串

kuarbcqp

kuarbcqp4#

最简单的解决方法之一是创建视图,然后为该视图创建一个Entity类,并对视图执行查询。

查看:

create or replace view view_comm_persondesc as select c.name, c.date, c.code, p.description from comm c inner join persondesc p on c.code = p.code;

字符串

验证码

@Entity(name = "view_comm_persondesc")
public class ViewCommPerson{ 
    @Id
    private String code;
    private String name;
    private Date date; 
    private String description;

    ... All Getters/Setters ...

}


    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<ViewCommPerson> query = cb.createQuery(ViewCommPerson.class);
    Root<ViewCommPerson> root = query.from(ViewCommPerson.class);
    // You can add your filter here
    List<ViewCommPerson> result = entityManager.createQuery(query).getResultList();


希望它能服务于你的用例。

相关问题