【问题标题】:Spring Hibernate: SQLQuery involving mapped entitiesSpring Hibernate:涉及映射实体的 SQLQuery
【发布时间】:2014-03-06 10:27:14
【问题描述】:

我有 Hibernate 生成的包含其他类的类 -

public class BookLoans implements java.io.Serializable {
    private BookLoansId id;
    private Borrower borrower;
    private LibraryBranch libraryBranch;
    private Book book;
    private Date dateOut;
    private Date dueDate;
}

BookLoansId 在哪里 -

public class BookLoansId implements java.io.Serializable {
private int bookId;
private int branchId;
private int cardNo;
}

分别是 Book、LibraryBranch 和 Borrower 表中的主键。当我运行此查询时 -

sessionFactory.getCurrentSession().createSQLQuery(
    "select * from library.tbl_book_loans l where cardNo = 4");

Hibernate 返回一个 Object[] 元素的列表。如果我尝试遍历这个列表,我会得到空对象。我从herehere 尝试了几种不同的方法。

有什么方法可以找出对象在每个 Object[] 中的排列方式?

【问题讨论】:

    标签: java sql spring hibernate mapping


    【解决方案1】:

    要将查询结果直接映射到实体对象,请使用addEntity(BookLoans.class);

       sessionFactory.getCurrentSession().createSQLQuery(
            "select * from library.tbl_book_loans l where cardNo = 4")
            .addEntity(BookLoans.class); 
    

    请参阅文档(16.1.2. 实体查询): http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html

    但是,您从尝试中获得的空值结果很奇怪。 Hibernate 应该为您提供对象数组列表,其中每个对象数组表示结果集中一行中的字段。检查查询是否真的返回了一些东西。

    【讨论】:

    • 如果我尝试访问映射的对象,我会得到一个空指针异常。如果我尝试打印出日期字段,则只是空值。但是, object[].tostring() 在控制台上打印一个哈希码。有没有办法判断字段在数组中的顺序?它们的排列顺序是否与 Class 的属性相同?
    • 可能顺序与表中相同(不确定)。表中有哪些数据?你能从一些 sql 工具中执行相同的查询并向我们展示结果吗?
    • 该表只有三个 int 列 - bookId、branchId、cardNo 和 2 个日期字段 - dateOut、dueDate。当我在 MySQL Workbench 上运行 SQL 查询时,它可以正确运行。将再试一次并更新结果。
    【解决方案2】:

    我使用 HQL 解决了这个问题:

    from library.tbl_book_loans where borrower.cardNo = 4
    

    Hibernate 现在可以正确填充所有映射实体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-28
      • 2014-04-14
      • 1970-01-01
      • 2012-07-05
      • 2021-07-05
      • 1970-01-01
      • 2017-09-20
      • 2014-12-29
      相关资源
      最近更新 更多