使用JPA标准无关联地连接表

时间:2015-06-04 08:47:37

标签: java hibernate jpa

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

comm包含列:

name
date
code

persondesc包含列:

code
description

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

com.code = persondesc.code

这两个表使用注释进行映射,但我没有声明关系。

我正在尝试选择comm排序的persondesc.description表格。

我该怎么做JPA和Hibernate?

3 个答案:

答案 0 :(得分:10)

因此,如果您的课程没有"关系"然后你做一个像

这样的查询
SELECT a FROM A a, B b WHERE a.someField = b.otherField ORDER BY b.anotherField

可以使用JPA Criteria,类似

来实现
CriteriaBuilder cb = emf.getCriteriaBuilder();
CriteriaQuery<A> crit = cb.createQuery(A.class);
Root<A> aRoot = crit.from(A.class);
Root<B> bRoot = crit.from(B.class);
aRoot.alias("a");
bRoot.alias("b");
crit.select(aRoot);
Predicate fieldEquals = cb.equal(aRoot.get(A_.someField), bRoot.get(B_.otherField);
crit.where(fieldEquals);
crit.orderBy(cb.asc(bRoot.get(B_.anotherField)));

...或者只是重新设计你的课程并帮助你的开发人员。

答案 1 :(得分:0)

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

主要实体:

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

答案 2 :(得分:0)

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以获得更详细的示例。