blinkfox / fenix

This is an extension library to the Spring Data JPA complex or dynamic SQL query. 这是一个比 MyBatis 更加强大的 Spring Data JPA 扩展库,为解决复杂动态 JPQL (或 SQL) 而生。https://blinkfox.github.io/fenix
https://blinkfox.github.io/fenix
Apache License 2.0
345 stars 72 forks source link

通用类型转换器 #45

Closed hexian closed 3 years ago

hexian commented 3 years ago

作者好, 在研究spring data jpa 类型转换时遇到一点问题, com.blinkfox.fenix.jpa.FenixJpaQuery#doCreateQuery(java.lang.Object[]) 这个方法

protected Query doCreateQuery(Object[] values) { 。。。。。。 if (queryFenix.nativeQuery()) { Class<?> type = this.getTypeToQueryFor(jpaMethod.getResultProcessor().withDynamicProjection( new ParametersParameterAccessor(jpaMethod.getParameters(), values)).getReturnedType(), querySql); query = type == null ? em.createNativeQuery(querySql) : em.createNativeQuery(querySql, type); } else { /*

}

我手动改了下改为:

// 如果自定义设置的返回类型不为空,就做额外的返回结果处理. String resultType = sqlInfo.getResultType(); // TODO: 1.获取 resultType 提前了。 if (queryFenix.nativeQuery()) { Class<?> type = this.getTypeToQueryFor(jpaMethod.getResultProcessor().withDynamicProjection( new ParametersParameterAccessor(jpaMethod.getParameters(), values)).getReturnedType(), querySql); query = type == null ? em.createNativeQuery(querySql) : em.createNativeQuery(querySql, type); } else { // TODO: 2.这里增加了一个判断 if (StringHelper.isNotBlank(resultType)) { query = em.createQuery(querySql); } else { Class<?> type = this.getTypeToQueryFor(jpaMethod.getResultProcessor().withDynamicProjection( new ParametersParameterAccessor(jpaMethod.getParameters(), values)).getReturnedType(), querySql); query = (type == null) ? em.createQuery(querySql) : em.createQuery(querySql, type); } }

    if (StringHelper.isNotBlank(resultType)) {
        query = new QueryResultBuilder(query, resultType).build(queryFenix.nativeQuery());
    }

这样是否可以?

如果我没有在xml加上 resultType , 而是提供一种通用的javax.persistence.Tuple转DTO的方式来转换

我试了下去掉xml的resultType获取到的结果就是Object[] 了,而正常的@Query可以返回 javax.persistence.Tuple 这个类型,因为Tuple 相当于是一个Map, 可以在方法调用链上增加类型转换器, 这样就可以实现通用的转换了,而不再需要每个都写 resultType="com.blinkfox.fenix.example.dto.BlogDto"

可能没有讲明白, 后面我试试提个pr