【问题标题】:Named Query, Native Query or Criteria API命名查询、本机查询或标准 API
【发布时间】:2013-04-23 21:05:52
【问题描述】:

我需要以报告的形式报告来自 3 个不同表格的数据。

用户可以搜索的各种搜索组合是..

  1. INS_USER_ID 和日期范围
  2. CUST_ACCT_ID
  3. CUST_ACCT_ID 和日期范围

查询..

select DISTINCT W.CUST_ACCT_ID, W.INS_USER_ID, WS.STTI_DATE, WS.STTI_AMT, WC.CMMT  from T_WRK W
       INNER JOIN T_WRK_STTI WS ON W.WRK_STTI_ID = WS.WRK_STTI_ID
       INNER JOIN T_WRK_CMMT WC ON W.WRK_ID = WC.WRK_ID
       WHERE W.CUST_ACCT_ID = 90610194 AND WS.STTI_DATE BETWEEN '01-JAN-12' AND '31-DEC-12'


select DISTINCT W.CUST_ACCT_ID, W.INS_USER_ID, WS.STTI_DATE, WS.STTI_AMT, WC.CMMT  from T_WRKCS W  
       INNER JOIN T_WRKCS_STTI WS ON W.WRKCS_STTI_ID = WS.WRKCS_STTI_ID
       INNER JOIN T_WRKCS_CMMT WC ON W.WRKCS_ID = WC.WRKCS_ID
       WHERE W.INS_USER_ID = 231 AND WS.STTI_DATE BETWEEN '01-JAN-12' AND '31-DEC-12' 

所有现有表都已使用 Hibernate/JPA 进行映射。

我已经阅读了足够多的关于谷歌的各种方法,有人可以告诉我以下哪一种休眠方法最适合我的场景。

  1. 命名查询
  2. 本机查询
  3. 标准 API

我正在考虑 NamedQuery,但还没有看到跨多个表的 NamedQuery,一个例子会很棒。谢谢。

【问题讨论】:

    标签: java oracle hibernate jpa


    【解决方案1】:

    Example

    @Entity
    @NamedQuery(name="findSalaryForNameAndDepartment",
        query="SELECT e.salary " +
              "FROM Student e" +
              "WHERE e.department.name = :deptName AND " +
              "      e.name = :empName")
    

    你也可以加入到部门表中并稍微改变查询

    对于日期使用参数

    em.createNamedQuery("xxx").setParameter("srtartDate", ...).setParameter("endDate",..)
    

    【讨论】:

    • 如果它是从单个实体/表(这里是学生)中选择,那么使用命名查询很好,但在我的情况下,我需要从多个表中进行选择,因为命名查询只是绑定到表它所在的位置。我正在寻找一个 select 跨越多个表的示例。
    • 我现在不能尝试,但是这样的 sql 在命名查询中也可以工作: SELECT e.salary FROM Student e , Department d WHERE e.department_id = d.id and d.name = :deptName AND e.name = :empName
    猜你喜欢
    • 2011-11-12
    • 1970-01-01
    • 2015-07-11
    • 2023-04-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    相关资源
    最近更新 更多