JPA-Attributeconverter无法与本机查询一起使用

问题描述

我创建了AttributeConverter类,该类将Enum转换为DB值并覆盖了必要的方法。 如果我使用如下所示的JPA查询,则将调用转换器并获得正确的结果。

@Query(value = "select * from driver where status=:status",nativeQuery = true)
    public List<Driver> findByStatus1(DriverStatus status);

但是,如果我与查询注释一起使用,则不会调用AttributeConverter。我有一个更复杂的查询,我需要在Attribute Converter中使用本机查询,但不适用于我。

@Converter(autoApply = true)
public class DriverStatusConverter implements AttributeConverter<DriverStatus,String> {

    @Override
    public String convertToDatabaseColumn(DriverStatus driverStatus) {
        if (driverStatus == null) {
            return null;
        }
        System.err.println("from converter" +driverStatus.getCode());
        return driverStatus.getCode();
    }

    @Override
    public DriverStatus convertToEntityAttribute(String code) {

        if (code == null) {
            return null;
        }

        return Stream.of(DriverStatus.values()).filter(c -> c.getCode().equals(code)).findFirst()
                .orElseThrow(IllegalArgumentException::new);
    }
}

有什么办法可以处理这个要求?

更新1 -以下是转换器代码

{{1}}

解决方法

遇到类似的问题,找不到满意的解决方案,所以不得不求助于丑陋的黑客......存储库方法签名更改如下:

public List<Driver> findByStatus1(Integer status);

...被这样称呼:

repository.findByStatus1(DriverStatus.YOUR_DESIRED_STATUS.getCode());

是的,它很丑,而且有点违背了 AttributeConverter 的目的,但至少它是有效的。在我的特殊情况下,我不得不仅通过一个本机查询来采取此类措施。 AttributeConverter 仍然适用于所有其他 JPA 查询。

,

删除nativeQuery = true并尝试。

@Query(value = "select * from driver where status=:status")
    public List<Driver> findByStatus1(DriverStatus status);

或者,您可以尝试像这样使用entityManager- 这只是示例代码。

TypedQuery<Trip> q = entityManager.createQuery("SELECT t FROM Trip t WHERE t.vehicle = :v",Trip.class);
q.setParameter("v",Vehicle.PLANE);
List<Trip> trips = q.getResultList();

参考- https://thorben-janssen.com/jpa-21-type-converter-better-way-to/