Select 明显不工作在 Spring 与 DSL 上下文

Select Distinct Not working in Spring with DSL Context

我有 ff。代码。

 @Override
    public Optional<TransactionJournalRecord> findByReferenceNumber(final String referenceNumber) {
        return this.dsl
            .select(TRANSACTION_JOURNAL.fields())
            .distinctOn(TRANSACTION_JOURNAL.CUSTOMER_NUMBER)
            .from(TRANSACTION_JOURNAL)
            .where(TRANSACTION_JOURNAL.REFERENCE_NUMBER.eq(referenceNumber))
            .fetchOptionalInto(TransactionJournalRecord.class);
    }

我想让它做的就是查询一个特定的参考号,但只得到第一个不同的参考号。不。因为我希望稍后处理具有相同参考号和客户编号的其他重复交易。

但是我一直收到这个错误

org.springframework.jdbc.BadSqlGrammarException: Access database using jOOQ; bad SQL grammar [select distinct on (`transaction_journal`.`customer_number`) `transaction_journal`.`id`, `transaction_journal`.`reference_number`, `transaction_journal`.`future_dated_transaction_id`, `transaction_journal`.`send_money_type_id`, `transaction_journal`.`source_account_number`, `transaction_journal`.`source_account_type`, `transaction_journal`.`customer_number`, `transaction_journal`.`request_id`, `transaction_journal`.`destination_account_number`, `transaction_journal`.`destination_account_type`, `transaction_journal`.`destination_validation`, `transaction_journal`.`transfer_schedule_type`, `transaction_journal`.`currency_id`, `transaction_journal`.`amount`, `transaction_journal`.`service_fee`, `transaction_journal`.`transaction_date`, `transaction_journal`.`posting_date`, `transaction_journal`.`status`, `transaction_journal`.`remarks`, `transaction_journal`.`created_date`, `transaction_journal`.`updated_date`, `transaction_journal`.`source_account_name`, `transaction_journal`.`username`, `transaction_journal`.`reason`, `transaction_journal`.`card_number`, `transaction_journal`.`status_remarks`, `transaction_journal`.`creditor_bank_code`, `transaction_journal`.`creditor_details`, `transaction_journal`.`mobile_number`, `transaction_journal`.`address`, `transaction_journal`.`channel_id`, `transaction_journal`.`system`, `transaction_journal`.`purpose_of_transaction`, `transaction_journal`.`esb_posted_date`, `transaction_journal`.`currency_id_destination`, `transaction_journal`.`gl_pa_status`, `transaction_journal`.`gl_sf_status`, `transaction_journal`.`gl_status_remarks`, `transaction_journal`.`email_address`, `transaction_journal`.`exchange_rate`, `transaction_journal`.`contact_type`, `transaction_journal`.`contact_value`, `transaction_journal`.`is_validated` from `transaction_journal` where `transaction_journal`.`reference_number` = ?]; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'on (`transaction_journal`.`customer_number`) `transaction_journal`.`id`, `transa' at line 1
    at org.jooq_3.11.12.MYSQL_8_0.debug(Unknown Source)

使用DISTINCT ON

您没有使用 DISTINCT,您使用的是 DISTINCT ON,这是 PostgreSQL 供应商特定的 SQL 功能。 In newer versions of jOOQ, DISTINCT ON is being emulated using window functions for other dialects,所以你可能想要升级。

您仍然需要一个 ORDER BY 子句才能使 DISTINCT ON 起作用。这是一个深奥的 PostgreSQL 发明,增加了 the logical order of operations in SQL.

的混乱

使用LIMIT

虽然 DISTINCT ON 可以实现您想做的事情,但它似乎过于复杂。这是解决问题的更简单方法,生成任意记录,或者可选地,如果您取消注释 ORDER BY 子句,first/last 记录给出一些顺序:

SELECT *
FROM transaction_journal
WHERE transaction_journal.reference_number = :referenceNumber
-- ORDER BY something
LIMIT 1

使用 jOOQ:

@Override
public Optional<TransactionJournalRecord> findByReferenceNumber(
    final String referenceNumber
) {
    return this.dsl
        .selectFrom(TRANSACTION_JOURNAL)
        .where(TRANSACTION_JOURNAL.REFERENCE_NUMBER.eq(referenceNumber))
        // .orderBy(something)
        .limit(1)
        .fetchOptional();
}

使用GROUP BY

请注意,在 MySQL 中,如果 strict mode is turned off,那么您在评论中提到的 GROUP BY 方法也会产生 任意 所有非 GROUP BY 列的值,这不是正确的标准 SQL.

DISTINCT ONLIMIT 不同,您无法控制所产生的价值。事实上,您甚至不能确定两个非 GROUP BY 值是否属于同一条记录。依赖这种过时的、MySQL 特定的行为绝不是一个好主意。

使用DISTINCT

仅用DISTINCT无法解决这个问题。如果你的搜索条件没有唯一约束,那么你总是会得到重复项,这将在 jOOQ.

中使用 fetchOptional() 时抛出异常。