【问题标题】:Hibernate Query: Get data for Class from joined tablesHibernate Query:从连接表中获取 Class 的数据
【发布时间】:2015-11-30 11:45:29
【问题描述】:

我用 Hibernate 设置了 2 个类: (为清楚起见,在下面进行了简化)

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;

二类

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

可以看出,这 2 个表已连接并共享“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 by Example,但无法使其正常工作。我知道我可以使用单个变量对每个表进行查询并以这种方式填充对象。但是,我相信如果我能一次性做到这一点,那么数据库的工作会更快/更容易/更少。

谁能指出我实现这一目标的正确方向?我是使用 SQL 和数据库的新手,不知道从哪里开始寻找。

【问题讨论】:

    标签: java sql hibernate hql


    【解决方案1】:

    如果我正确理解您的问题,您应该能够在 where 子句中包含第二类的字段,如下所示:

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

    【讨论】:

      【解决方案2】:

      如果从单个实体中选择,则不需要加入,因此您的代码可能是这样的 "FROM ClassOne WHERE fieldTwo = :fieldTwo"

      【讨论】:

        【解决方案3】:

        我觉得这个问题很令人困惑,但如果我理解正确,您可能希望从以下关系中获取 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 );
        

        【讨论】:

        • 对于这个不清楚的问题,我深表歉意。我不知道 idField 的值是什么。我确实知道 ClassTwofieldTwo 中有什么。我希望能够仅使用这些信息来获取 ClassOne 的 idField。
        • 不是。但只是说它是..我有更多的字段放在一起时会返回一个独特的结果。为了简单起见,我只是在问题中使用了一个。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-10
        • 1970-01-01
        • 1970-01-01
        • 2017-09-24
        • 2013-05-27
        相关资源
        最近更新 更多