Closed hexian closed 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 { /*
这里不太了解作者为什么不和上面的一样使用 Class<?> type = this.getTypeToQueryFor(jpaMethod.getResultProcessor().withDynamicProjection( new ParametersParameterAccessor(jpaMethod.getParameters(), values)).getReturnedType(), querySql); query = type == null ? em.createQuery(querySql) : em.createQuery(querySql, type);
/ query = em.createQuery(querySql); } 。。。。。。
// 如果自定义设置的返回类型不为空,就做额外的返回结果处理. String resultType = sqlInfo.getResultType(); if (StringHelper.isNotBlank(resultType)) { // 猜测: 应该是为了这里使用 query = new QueryResultBuilder(query, resultType).build(queryFenix.nativeQuery()); }
}
我手动改了下改为:
// 如果自定义设置的返回类型不为空,就做额外的返回结果处理. 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
作者好, 在研究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 { /*
这里不太了解作者为什么不和上面的一样使用 Class<?> type = this.getTypeToQueryFor(jpaMethod.getResultProcessor().withDynamicProjection( new ParametersParameterAccessor(jpaMethod.getParameters(), values)).getReturnedType(), querySql); query = type == null ? em.createQuery(querySql) : em.createQuery(querySql, type);
/ query = em.createQuery(querySql); } 。。。。。。
// 如果自定义设置的返回类型不为空,就做额外的返回结果处理. String resultType = sqlInfo.getResultType(); if (StringHelper.isNotBlank(resultType)) { // 猜测: 应该是为了这里使用 query = new QueryResultBuilder(query, resultType).build(queryFenix.nativeQuery()); }
}
我手动改了下改为:
// 如果自定义设置的返回类型不为空,就做额外的返回结果处理. 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); } }
这样是否可以?
如果我没有在xml加上 resultType , 而是提供一种通用的javax.persistence.Tuple转DTO的方式来转换
我试了下去掉xml的resultType获取到的结果就是Object[] 了,而正常的@Query可以返回 javax.persistence.Tuple 这个类型,因为Tuple 相当于是一个Map, 可以在方法调用链上增加类型转换器, 这样就可以实现通用的转换了,而不再需要每个都写 resultType="com.blinkfox.fenix.example.dto.BlogDto"
可能没有讲明白, 后面我试试提个pr