问题描述
我创建了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/