【问题标题】:JPA - Attributeconverter not working with native queryJPA - Attributeconverter 不适用于本机查询
【发布时间】:2021-01-19 00:16:40
【问题描述】:

我创建了 AttributeConverter 类,它将 Enum 转换为 DB 值并覆盖了必要的方法。 如果我使用下面的 JPA 查询,那么转换器会被调用并得到正确的结果。

public List<Driver> findByStatus(DriverStatus status);
    

但是,如果我使用 Query 注释,则不会调用 AttributeConverter。我有更复杂的查询,我需要将本机查询与属性转换器一起使用,但它对我不起作用。

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

有没有办法处理这个要求?

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

@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);
    }
}

【问题讨论】:

  • 如果可能,您能否提供converterentity 代码sn-p?
  • 将代码添加到问题@Sujitmohanty30
  • 谢谢,但我也希望您也添加实体。

标签: sql spring-boot hibernate spring-data-jpa


【解决方案1】:

删除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/

【讨论】:

  • 建议的查询无效 JPQL
  • 你说的是第二个吗?这只是您如何使用entityManager 创建查询的一个示例。我已经在回答中提到这只是一个样本。基本上我想让你尝试使用entityManager
  • 我说的是第一个
  • 怎么回事?这是参考:baeldung.com/spring-data-jpa-query
  • select * from driver where status=:status 是原生 SQL 查询。您不能只删除 nativeQuery = true 并期望它起作用。在您链接到的参考资料中,nativeQuery = truenativeQuery = false 的查询不同
【解决方案2】:

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

public List<Driver> findByStatus1(Integer status);

...并被这样称呼:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-15
    • 2017-10-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    相关资源
    最近更新 更多