Java Hibernate - 使用子查询进行复杂的更新

标签 java hibernate sql-update subquery

我有多年的 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
)
;

最佳答案

您必须使用条件选择记录。

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' 并在数据库中更新它。

关于Java Hibernate - 使用子查询进行复杂的更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18954920/

相关文章:

java - Hibernate配置问题

java - 子类和 hql

mysql - 使用 JOIN 和 GROUP_CONCAT 进行更新

java - 支柱 2 : Send XML data to server from client?

java - 如何在 vanilla Tomcat 上部署 Java EE 应用程序?

java - Stackoverflow 和 Hibernate 使用 sql IN (id, id, id, id..id)

java - JOOQ 更新表以及连接表的条件

mysql - SQL - 更新表和排序依据?

java - 如何在 firebase 数据库上的某个日期之后删除子节点?

java - Tomcat8 - 获取带有重音的图像文件 404 "not found"