我有两个没有建模关系的表:
表comm
包含列:
name
date
code
表persondesc
包含列:
code
description
两个表之间的关系是多对一(多个 comm 到一个 persondesc ):
com.code = persondesc.code
这两个表使用注释进行映射,但我没有声明关系。
我正在尝试选择comm
排序的persondesc.description
表格。
我该怎么做JPA和Hibernate?
答案 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)