【问题标题】:How to Inner Join Two Independent Entities in Hibernate如何在 Hibernate 中内连接两个独立实体
【发布时间】:2016-12-14 08:30:16
【问题描述】:

我有 2 个实体:DocumentEntity (docNumber (primary key), dateOfFill, ...)FileEntity (id, title, size, ...)。我有一个内部连接为 2 的 HQL 查询,它应该在 Oracle DB 上运行:

String queryStr = "SELECT docNumber " +
             + "FROM DocumentEntity d " +
             + "INNER JOIN FileEntity f " +
             + "ON d.docNumber = f.title " +
             + "WHERE d.date > to_date('01.01.2011','dd.mm.yyyy')"

Query query = em.createQuery(query_string);
return query.getResultList();

当我运行代码 sn-p 时,我得到一个异常 org.hibernate.hql.ast.QuerySyntaxException: Path expected for join!

我看过

但没有一个解决我的问题。在这个例子中不能使用建议的路径(至少它给出了错误的路径错误)。最后一个链接的答案是:

只有在实体之间存在关联时才能使用联接。

问题是我无法关联这两个实体。

问题是: 如何加入这 2 个实体?

更新: 我的实体是:

@Entity
@Table(name = "DOCUMENT")
public class DocumentEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "DOC_NUMBER", nullable = false)
    private String docNumber;

    @Basic(optional = false)
    @Column(name = "DATE_OF_FILL")
    @Temporal(TemporalType.DATE)
    private Date dateOfFill;

    ...
}

@Entity
@Table(name = "FS_FILE")
public class FileEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @SequenceGenerator(name = "FS_FILE_SEQ", allocationSize = 1, sequenceName = "FS_FILE_SEQ")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "FS_FILE_SEQ")
    @Column(name = "ID", nullable = false)
    protected Long id;

    @Column(name = "TITLE", nullable = false)
    protected String title;

    @Column(name = "MIMETYPE", nullable = false)
    protected String mimetype;

    @Column(name = "FILESIZE", nullable = false)
    protected Long filesize;

    @Column(name = "FILEPATH", nullable = false)
    protected String filepath;

    ...
}

【问题讨论】:

  • 你能显示你的两个实体的配置吗?
  • @davidhxxx:你到底是什么意思?你到底想看到什么?
  • @davidhxxx:我刚刚更新了问题。
  • 要进行连接,从属实体中至少应该有一个 fk 字段。没看到啊。。
  • @davidhxxx:是的,我没有 FK,因为 FS_FILE 的数据来自 DOCUMENT 以外的表。

标签: java oracle hibernate join entity


【解决方案1】:

在这种情况下,您不需要进行连接,因为您使用条件d.docNumber = f.title 限制了结果。 只需在 where 子句中添加条件并使用 SQL 查询而不是 JPQL 查询,因为它似乎更符合您的需要。

String sqlString= "SELECT d.docNumber " +
             + "FROM DOCUMENT d, FS_FILE f " +
             + "WHERE d.docNumber = f.title " +
             + "AND d.date > to_date('01.01.2011','dd.mm.yyyy')"


Query query = em.createNativeQuery(sqlString);
return query.getResultList();

【讨论】:

  • 并将 FileEntity 放在 FROM caluse 中 DocumentEntity 的旁边?
  • 不,你不能。我更新了我的代码。在您的情况下,本机 sql 查询似乎更符合您的需求。
  • 我昨天尝试使用 createNativeQuery(),但是我混合了 JPQL 和 SQL,所以没有结果...一旦我使用纯 SQL 和 createNativeQuery(),它就起作用了。非常感谢。但是,这意味着 JPQL 对 SQL 有一些限制和缺点:)
  • 太棒了。不客气。 JPQL 是 SQL 之上的一层,它带来了 ORM 的特性,但也有一些限制。特别是对于对该工具不友好的查询。在您的情况下,您的实体与工具无关,与 JPA 映射无关。为了满足您的需求,您可以执行 JPQL 查询,但它会比 SQL 查询复杂得多。您应该查询 select 中的两个对象,然后您将检索一个包含两个实体的 Object 数组...该死的检索一个数字 :)
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 2013-06-02
  • 2012-08-03
  • 1970-01-01
  • 2018-03-02
  • 2012-06-09
  • 2012-08-03
  • 1970-01-01
相关资源
最近更新 更多