【问题标题】:Java Hibernate - complicated update with subqueryJava Hibernate - 使用子查询进行复杂更新
【发布时间】:2013-09-23 08:36:26
【问题描述】:

我有多年的 SQL 经验。我是 Hibernate 的新手,我已经了解了 Hibernate 的基础知识。 下面的逻辑是必需的;但是我更改了表名以确保它不会泄露公司详细信息。 另请注意,SQL 必须作为一条 SQL 语句运行 - 其他应用程序可以在此语句运行的同时更新表。 表格设计无法更改,因为其他应用程序已经在使用它们进行生产。

有人可以演示如何在 Hibernate 中进行以下更新吗? createNativeQuery 是一个选项吗??

    update
    PERSON P
    set
    P.STATUS = 'Happy'
    where
    P.PK_ID = :person_id
    and
    (
    select count(1)
    from WORK_JOBS WJ
    where WJ.RESOLVED_STATUS is null
    ) = 0
    and
    (
    select count(1)
    from EXPENSES EX
    where EX.COST > :max_exp_cost
    ) = 0
    ;

简化的表格定义如下。

create table PERSON
(
PK_ID         NUMBER NOT NULL,
LAST_NAME     VARCHAR2(100),
FIRST_NAME    VARCHAR2(100),
PRIMARY KEY   PK_ID
)
;


create table WORK_JOBS
(
PK_ID             NUMBER NOT NULL,
SUMMARY           VARCHAR2(100),
DESCRIPTION       VARCHAR2(1000),
RESOLVED_STATUS   VARCHAR2(50),
PRIMARY KEY       PK_ID
)
;

create table EXPENSES
(
PK_ID             NUMBER NOT NULL,
SUMMARY           VARCHAR2(100),
DESCRIPTION       VARCHAR2(1000),
COST              DECIMAL(10,2),
PRIMARY KEY       PK_ID
)
;

【问题讨论】:

    标签: java hibernate sql-update subquery


    【解决方案1】:

    您必须使用标准选择记录。

    criteria=getCurrentSession().createCriteria(PERSON.class, "person");
    
    DetachedCriteria dCriteria=DetachedCriteria.forClass(WORK_JOBS.class, "workjobs");
    
    DetachedCriteria dCriteria=DetachedCriteria.forClass(EXPENSES.class, "workjobs");
    
    criteria.add(Subqueries.Exists()); 
    

    然后你必须为每个 Person 对象设置 P.STATUS = 'Happy' 并在数据库中更新它。

    【讨论】:

      【解决方案2】:

      您可以使用 HQL 更新查询来实现:

         String updateQuery = "update Person p set p.status=:pstatus "
                      + "where p.id=:pid and (select count(*) from WorkJobs wj "
                      + "where wj.status=:wjstatus)=:wjcount and (select count(*) "
                      + "from Expences e where e.cost > :ecost)=:ecount";
      
              BigDecimal maxCost = new BigDecimal(20.0);
              Long pid = new Long(1l);
      
              Query query = session.createQuery(updateQuery);
      
              query.setParameter("pstatus", "Happy");
              query.setParameter("pid", pid);
              query.setParameter("wjstatus", null);
              query.setParameter("wjcount", 0l);
              query.setParameter("ecost", maxCost);
              query.setParameter("ecount", 0l);
      
              int rowCount = query.executeUpdate();
      

      【讨论】:

      • 这是我实现它的方式。 (超过 3 周前,我更新 StackOverflow 的速度很慢。)我必须解决一个问题:wj.status=:wjstatus 在参数为空时不起作用。它必须是wj.status is null。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2019-02-05
      • 2011-05-14
      • 2014-05-12
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多