当前位置: 首页 > 知识库问答 >
问题:

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

籍昱
2023-03-14

我有两个没有建模关系的表:

带有列的表comm

name
date
code

带有列的表

code
description

两个表之间的关系是多对一(多通信对一个人C):

通用域名格式。代码=人员C。密码

这两个表用注释映射,但我没有声明任何关系。

我试图选择的是按人员排序的表。说明。

我怎样才能做到JPA和Hibernate?

共有3个答案

戚云
2023-03-14

如果您需要按另一个表中的列进行排序,您可以使用禁用的可插入和可更新属性创建“伪”依赖项。域模型如下所示:

主要实体:

@Entity
public class Comm {

    @Id
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "date")
    private Date date;

    @Column(name = "code")
    private String code;

    @OneToOne(fetch = FetchType.LAZY) // @ManyToOne is also possible
    @JoinColumn(name = "code", referencedColumnName = "code", insertable = false, updatable = false)
    private PersonDesc personDesc;

}

具有排序所需数据的实体:

@Entity
public class PersonDesc {

    @Id
    private String code;

    @Column(name = "description")
    private String description;

}

定义域模型后,可以创建条件查询:

CriteriaBuilder cb = emf.getCriteriaBuilder();
CriteriaQuery<Comm> cq = cb.createQuery(Comm.class);
Root<Comm> root = cq.from(Comm.class);
Join<Comm, PersonDesc> leftJoin = root.join("personDesc", JoinType.LEFT);
cq.select(root);
cq.orderBy(cb.asc(root.get("personDesc.description")));
祁英哲
2023-03-14

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();

单击此处查看更详细的示例。

聂炜
2023-03-14

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

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)));

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

 类似资料:
  • 此查询用于检索一对多关系中的最后记录(请参阅SQL连接:选择一对多关系中的最后记录) 我的问题是:如何使用jpa criteria api使用subselect构建这个连接?可能吗?如果没有,可以使用jpql吗? 到目前为止我的代码:

  • 两个数据库表具有外键关系。 它们通过JPA映射到两个实体A和B,但是连接列是从实体中手动删除的,因此在JPA世界中,类A和B是不相关的,您不能通过字段/属性从一个类导航到另一个类。 使用JPA标准API,是否可以创建连接两个表的查询? 我在互联网上找到的所有示例都使用join列来实现目标,但如上所述,它已从代码中删除,因为大多数时候我对A和B之间的关系不感兴趣,而且我担心可能的开销。

  • 问题内容: 我在Java中有2个POJO类,Answer和Collaborator,具有多对多关系。 类有一套,但没有一套。我需要在Hibernate中进行的工作是找到合作者,以获得id给出的答案。 我已经使用结果转换器使用Hibernate ()进行了此操作,但是在使用时我陷入了困境,因为我没有要提供给联接的答案列表。 问题答案: 完成了,终于… 这是代码:

  • 问题内容: 我有具有相同结构的不同表,我想通过它们的一列将它们连接起来。 问题在于他们不共享该列中的信息。 结果表: (在单列中) 到目前为止,我已经尝试过: 我知道我的查询是错误的,因为我要调用更多我想要的列,但是我不确定如何将所有列合并到一个列中。我该怎么做? 问题答案: 你有没有尝试过? 如果您不想排除重复的值,则可能要使用。 要限制结果集,您可以执行以下操作:

  • 尝试编写一个标准api查询。 应该作为参数传递,并且可以更改。我在代码中添加了实体。 感谢任何帮助或指导。 这就是我目前的情况: 我现在能够获取正确的数据,但列表没有排序。这是我在日志中看到的,生成了两个查询,一个有顺序,另一个没有顺序。

  • 另一个宽大处理--B: 这里要注意,实体A和B之间没有隐式关系,B表中的a_id是手工处理的,因此--关系类似于一对多(A-->B),但不是jpa-hibernate关系。而且,我的FullDto有A的所有属性和B的列表: 现在,我想从A的存储库接口中提取所有内容(A和B表一次完成),如下所示: