2017-06-29 18 views
0

現在、レコードを使用してアップストール(3.10スナップショットを使用)を実行しようとしていますが、addRecord(R)を使用したときに更新のsetデータがクエリに追加されていません。私が持っているDAOで:programAssignmentsのためのクラスの内部PostgreSQL Upsertでレコードを使用する

try (Connection writeConn = DatabaseManager.getConnection(true); 
      final DSLContext writeContext = DatabaseManager.getBuilder(writeConn); 
      InsertQuery<UserProgramAssignmentsRecord> programAssignmentsUpdateQuery = writeContext 
        .insertQuery(AccessControlWriteDAO.userProgramAssignments)) { 
     programAssignmentsUpdateQuery.onDuplicateKeyUpdate(true); 

     programAssignments.forEach(pa -> programAssignmentsUpdateQuery.addRecord(pa.toRecord())); 

     if (!programAssignments.isEmpty()) { 
      if (AccessControlWriteDAO.logger.isInfoEnabled()) { 
       AccessControlWriteDAO.logger.info(writeContext.renderInlined(programAssignmentsUpdateQuery)); 
      } 
      // programAssignmentsUpdateQuery.execute(); 
     } 
    } catch (final SQLException e) { 
     throw new DAOException(e.getMessage(), e); 
    } 

、私が持っている:

/** 
* <p> 
* This method turns the object into a {@link Record} that can then be attached to a {@link Connection} and 
* {@link DSLContext}. 
* </p> 
* 
* @return A usable {@link UserProgramAssignmentsRecord} 
*/ 
public UserProgramAssignmentsRecord toRecord() { 
    UserProgramAssignmentsRecord upar = new UserProgramAssignmentsRecord(); 
    getAdministerProgram().ifPresent(upar::setAdminister); 
    getCreateProjects().ifPresent(upar::setCreateProjects); 
    getJustification().ifPresent(upar::setJustification); 
    getProgramId().ifPresent(upar::setProgramId); 
    getUserId().ifPresent(upar::setUserId); 
    getViewRevisions().ifPresent(upar::setViewRevisions); 

    return upar; 
} 

をコードは、次のクエリを生成します。

insert into "%%removed%%"."user_project_assignments" (
    "project_id", 
    "edit_draft", 
    "justification", 
    "user_id" 
) 
values (
    98332, 
    true, 
    'The user created the project', 
    675 
) 
on conflict (
    "project_id", 
    "user_id" 
) do update 
set [ no fields are updated ] 

は私がに切り替えてください。 addValue(Field<T>,T)addValueForUpdateField(Field<T>,T)を使用して、そしてNewRecordと?私はがレコードを渡すと同等になることを思っただろうが、それは - または - 私は私のtoRecord()方法で何か間違ったことをやって更新するために、フィールドを設定していないようaddRecord(R)としてケースのように思えないのですか? InsertQueryオブジェクトに対するaddRecordForUpdate(R)のいくつかの種類がありますか?そして、これは複数行のアップセル(これは私がやろうとしていることです)でどれくらい効果がありますか? 1はaddRecord(R) + onDuplicateKeyUpdate(true)があるだろうと、更新データがまたはに設定されていることを意味するであろうことをと思うかもしれませんが

答えて

0

ドキュメントを確認した後、私は....これは...欠乏症の少しだと思いますaddValueForUpdate(R)、それは(明らかに)間違っています。

try (Connection writeConn = DatabaseManager.getConnection(true); 
      final DSLContext writeContext = DatabaseManager.getBuilder(writeConn); 
      InsertQuery<UserProgramAssignmentsRecord> programAssignmentsUpdateQuery = writeContext 
        .insertQuery(AccessControlWriteDAO.userProgramAssignments)) { 
     programAssignmentsUpdateQuery.onDuplicateKeyUpdate(true); 

     programAssignments 
       .forEach(assignment -> AccessControlWriteDAO.addRecordToUpsert(programAssignmentsUpdateQuery, 
         assignment.toRecord(), assignment.toExcludedMap())); 

     if (!programAssignments.isEmpty()) { 
      if (AccessControlWriteDAO.logger.isInfoEnabled()) { 
       AccessControlWriteDAO.logger.info(writeContext.renderInlined(programAssignmentsUpdateQuery)); 
      } 
      programAssignmentsUpdateQuery.execute(); 
     } 
    } catch (final SQLException e) { 
     throw new DAOException(e.getMessage(), e); 
    } 

その後、I、きれいなものを維持するために、作られた:

/** 
* <p> 
* This method returns mappings that can be used in an UPSERT in the update portion of the query. 
* </p> 
* 
* @return A map between the assignments table and the excluded table 
*/ 
public Map<Field<?>, Field<?>> toExcludedMap() { 
    final UserProgramAssignments excludedTable = UserProgramAssignment.pua.as("excluded"); 

    final Map<Field<?>, Field<?>> excludedMap = new HashMap<>(4); 
    getAdministerProgram() 
      .ifPresent(i -> excludedMap.put(UserProgramAssignment.pua.ADMINISTER, excludedTable.ADMINISTER)); 
    getCreateProjects().ifPresent(
      i -> excludedMap.put(UserProgramAssignment.pua.CREATE_PROJECTS, excludedTable.CREATE_PROJECTS)); 
    getJustification() 
      .ifPresent(i -> excludedMap.put(UserProgramAssignment.pua.JUSTIFICATION, excludedTable.JUSTIFICATION)); 
    getViewRevisions().ifPresent(
      i -> excludedMap.put(UserProgramAssignment.pua.VIEW_REVISIONS, excludedTable.VIEW_REVISIONS)); 

    return excludedMap; 
} 

私は、このように行うには、私のDAOを調整する:私のソリューションは、このように見えた別の方法toExcludedMap()を持って、私のPOJOを持っていることでしたInsertQueryを更新し、新たな方法:

/** 
* <p> 
* This method is used to add a record and the update information to an UPSERT query. 
* </p> 
* 
* @param query 
*   The query to add to 
* @param record 
*   The record to add 
* @param excludedMap 
*   The mappings to the "excluded" table for this record 
*/ 
private static <R extends Record> void addRecordToUpsert(final InsertQuery<R> query, final R record, 
     final Map<Field<?>, Field<?>> excludedMap) { 
    query.addRecord(record); 
    query.addValuesForUpdate(excludedMap); 
} 

それはの種類は、我々は対称性を持っていると私は1)にするために持っていることはありませんことを吸いますマップは、2)私は、これは現在唯一の方法であると信じてにデータを取得するために、さらに別のメソッド呼び出しを行う必要がありますが。 jOOQは、更新データを追加または少なくともレコードに取って、PKを(私たちは重複したキーに更新している場合、明らかにPKが変更されていないので)除外場合、それはいいだろう、多分これは不可能です。

関連する問題