0

私はSQLで長年の経験があります。私は Hibernate を初めて使用します。Hibernate の基本を理解しました。以下のロジックが必要です。ただし、会社の詳細が明らかにならないようにテーブル名を変更しました。また、SQL は 1 つの 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
)
;
4

2 に答える 2

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' を設定し、データベースで更新する必要があります。

于 2013-09-23T11:44:48.627 に答える
0

これを実現するには、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();
于 2013-09-23T12:15:51.353 に答える