Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

通用类型转换器 #45

Closed
hexian opened this issue Jun 19, 2021 · 0 comments
Closed

通用类型转换器 #45

hexian opened this issue Jun 19, 2021 · 0 comments

Comments

@hexian
Copy link
Contributor

hexian commented Jun 19, 2021

作者好, 在研究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

@hexian hexian closed this as completed Jul 4, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant