使用 Micronaut Data JDBC,如何转换 WHERE 子句的值?

With Micronaut Data JDBC, how do I transform a value for WHERE clauses?

我正在使用 Micronaut Data JDBC 1.1.3 和 MySQL 8.0 数据库。我想让我的 id 列使用 BINARY(16) 存储并使用 BIN_TO_UUID()/UUID_TO_BIN() 来转换值。我虽然可以使用 Micronaut Data 的 @ColumnTransformer 来做到这一点,就像这样:

public class User {
    @Id
    @ColumnTransformer(read = "BIN_TO_UUID(user_.id)", write = "UUID_TO_BIN(?)")
    private UUID id;

    // ...
}

然后我使用这样的 UserRepository:

@JdbcRepository(dialect = Dialect.MYSQL)
public interface UserRepository extends RxJavaCrudRepository<User, UUID> {
}

它非常有效,因为 id 列在查询结果中被正确转换。但是,当我尝试使用 userRepository.findById(id).toSingle() 按 ID 查找内容时,出现错误(“MaybeSource 为空”),并且我可以在跟踪输出中看到它没有转换值:

15:17:04.878 [pool-1-thread-76] DEBUG io.micronaut.data.query - Executing Query: SELECT BIN_TO_UUID(user_.id) AS id,user_.`username` FROM `user` user_ WHERE (user_.`id` = ?)

这是预期的吗?还有什么我可以做的来转换查询吗?我必须写一个明确的查询吗?

我认为这是 Micronaut-Data 1.1.3 中的错误。

作为一种变通方法,我会像这样覆盖查询:

@ReadOnly
@Override
@Query(
   "SELECT * FROM user WHERE user.id = :id")
Optional<User> findById(UUID id);

在 UserRepository 界面中。

BTW 查询需要根据您的需要进行定制。