Java 使用JPA标准连接没有关系的表
我有两个没有建模关系的表: 表Java 使用JPA标准连接没有关系的表,java,hibernate,jpa,Java,Hibernate,Jpa,我有两个没有建模关系的表: 表comm带列: name date code code description 表persondesc带列: name date code code description 这两个表之间的关系是多对一(多对一) com.code=personesc.code 这两个表是用注释映射的,但我没有声明任何关系 我要做的是选择comm表,该表按persondesc.description排序 如何在JPA和Hibernate中执行此操作?因此,如果您的类没有“关系”
comm
带列:
name
date
code
code
description
表persondesc
带列:
name
date
code
code
description
这两个表之间的关系是多对一(多对一)
com.code=personesc.code
这两个表是用注释映射的,但我没有声明任何关系
我要做的是选择comm
表,该表按persondesc.description
排序
如何在JPA和Hibernate中执行此操作?因此,如果您的类没有“关系”,那么您可以执行如下查询
SELECT a FROM A a
CROSS JOIN B b
WHERE a.someField = b.otherField
ORDER BY b.anotherField
这可以通过JPA标准来实现,比如
CriteriaBuilder cb=emf.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(A.class);
Root aRoot=query.from(A.class);
Root bRoot=query.from(B.class);
aRoot.别名(“a”);
bRoot.别名(“b”);
query.select(aRoot)
.where(cb.equal(aRoot.get(A_.someField),bRoot.get(B_.otherField))
.orderBy(cb.asc(bRoot.get(B_.anotherField));
…或者只是重新设计您的类,帮您的开发人员一个忙。如果您需要按另一个表中的列进行排序,您可以使用禁用的可插入和可更新属性创建“伪”依赖项。域模型如下所示: 主要实体:
@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")));
CriteriaBuilder cb=emf.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(Comm.class);
Root Root=cq.from(Comm.class);
Join-leftJoin=root.Join(“personDesc”,JoinType.LEFT);
选择(根);
orderBy(cb.asc(root.get(“personDesc.description”));
Hibernate 5.1在的不相关实体上引入了显式连接。因此,现在您可以像本机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();
List results=entityManager.createQuery(“从Comm c中选择c”+
“在c.code=pd.code上加入PersonDesc pd”+
“按pd.说明订购”,通信类)
.getResultList();
单击此处查看更详细的示例。这里的“Hibernate标准”和“使用Hibernate”相关性是什么?您没有使用JPA API吗?chsdk-这不是同一个问题。在我的问题中,两个对象/表映射在Snukker问题的Java注释中,一个对象/表或者根本没有映射“未映射到Java注释或xml中。”这些
.alias()
重要吗?如果您的JPA提供程序在生成的SQL中使用它们以使其更具可读性,那么这些都很重要。但是,您可能会运气不好,有一个JPA提供程序按照自己的感觉操作,并在SQL中创建丑陋的名称SQL@Neil斯托克顿“…或者只是重新设计您的类,帮您的开发人员一个忙。"如果您有一个包含公共实体的基本模块,然后有人编写了一个使用公共实体并且还包含实体扩展类的模块,例如CommonEntity
和CommonEntityDimensionData
。假设CommonEntity
无法修改,则不知道扩展类。Wh“A”和“B”是从哪里来的。当我尝试这个方法时,我得到“无法解析符号“A”@slashdottir它是元模型