根据对象类别对不同字段的预测

时间:2017-10-19 17:46:04

标签: querydsl

我有一个抽象的类A和类B,它扩展了A类。

我想做一些依赖于真实对象类的投影。

是否可以在querydsl(v 3.7.2)中执行以下操作:

new CaseBuilder()
.when(qObject.innstaceOf(B.class))
.then(qObject.as(B.class).fieldFromBclass)
.otherwise(qObject.field.fieldFromAclass)

根据对象类型,可以在不同的字段上进行投影吗?

1 个答案:

答案 0 :(得分:0)

querydsl Q类是自动生成的类,它们将数据库表映射到类的Java表示形式(RelationalPathBase),以便可以像数据库表一样查询它们,并具有使用querydsl' s的额外好处流畅的API /编译时类型安全等。

我想从示例中可以看到abstract class Aclass B extends A,这些是POJO,旨在将SQL语句的结果收集到Collection Java对象中。最后,我认为您需要List个Java对象,其中每个对象都包含从SELECT语句返回的所有字段。

查看示例中的CaseBuilder,所有querydsl都在这里将Java语法转换为SQL并通过JDBC在数据库上运行它。数据库不了解Java。例如。这将是CaseBuilder的标准用法。

new CaseBuilder()
.when(qObject.name.eq("Robert Bain"))
.then("Rob")
.otherwise("Not Rob")

这将生成SQL(Oracle语法)

CASE WHEN q_object.name = 'Robert Bain' THEN 'Rob' ELSE 'Not Rob' END

我们无法知道数据库将在语句执行之后返回什么,因此无法知道要填充的POJO类。我也不知道为什么它有用,因为SQL语句将返回相同类型的相同列,因此可以填充相同的类。为什么要区分?

如果需要区分,我的建议是让一个用于投射的类(或使用Tuple)并执行逻辑以将行分成服务层中的不同类,之后数据已经退回。