Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JPA标准连接没有关系的表_Java_Hibernate_Jpa - Fatal编程技术网

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它是元模型