2015-11-30 67 views
1

我有2类建立与Hibernate找类数据: (下面简化为清楚起见)Hibernate查询:从连接表

ClassOne

@Entity 
@Table(name = "SCHEMA.TBLONE") 
public class ClassOne { 

@Id 
@Column(name = "DCDINO") 
private String idField; 
@Column(name = "DCGNUM", nullable = false) 
private String fieldTwo; 
@OneToOne(mappedBy = "classOne") 
@Cascade(value = org.hibernate.annotations.CascadeType.ALL) 
private ClassTwo classTwo; 

ClassTwo

@Entity 
@Table(name = "SCHEMA.TBLTWO") 
public class ClassTwo { 

@Id 
@Column(name = "DDDINO", nullable = false) 
private String idField; 
@Column(name = "DDFRNM", nullable = false) 
private String fieldTwo; 
@OneToOne 
@PrimaryKeyJoinColumn 
private ClassOne classOne; 

由于可以s een,这两个表被加入并共享'idField'。
一切都正确连接在一起,当我做一个查询到,像这样的数据库被填充预期:(使用正确的参数)

Query query = session 
    .createQuery("FROM ClassOne WHERE 
idField= :idField AND fieldTwo = :fieldTwo"); 
query.setString("idField", idField); 
query.setString("fieldTwo", fieldTwo); 

我遇到的问题是,我现在需要能够来填充ClassOne,但不知道idField的值。我知道两个类的fieldTwo的值,但完全不知道如何将它写入Query的形式。我看过Query by Example,但一直无法使其工作。我知道我可以使用单个变量对每个表进行查询,并以这种方式填充对象。但是,如果我能够以一种方式做到这一点,我相信这对数据库来说会更快/更容易/更少工作。

有人能指出我在正确的方向来实现这一目标吗?我新来SQL和数据库工作,不知道从哪里开始寻找。

回答

2

如果我正确理解你的问题,你应该能够包括从场第二类在你的where子句中是这样的:

Query query = session 
    .createQuery("FROM ClassOne c1 WHERE c1.classTwo.fieldTwo = :fieldTwo"); 

query.setString("fieldTwo", fieldTwo); 
0

你不需要加入,如果你从单一的实体选择,让你的代码可能就跟这个 “FROM ClassOne WHERE fieldTwo =:fieldTwo”

0

我觉得这个问题很混乱,但如果我理解正确你可能想从这种关系中获得ClassOne如下:

的假设是,你知道ClassTwo的id

Query query = session 
.createQuery("SELECT c1 FROM ClassOne c1 JOIN ClassTwo c2 ON c1 = c2.classOne WHERE 
c2.fieldTwo= :fieldTwo); 
query.setString("fieldTwo", fieldTwo); 
+0

我对不清楚的问题表示歉意。我不知道idField的价值是什么。我知道什么是**领域两个** ** ClassTwo **。我希望能够使用这些信息获得ClassOne的idField。 – Jay

+0

FieldTwo是独一无二的吗? – Miles

+0

它不是。但只是说它是..我有更多的领域,当放在一起将返回一个独特的结果。为了简单起见,我只是在问题中使用了一个。 – Jay