我有一个抽象的类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)
根据对象类型,可以在不同的字段上进行投影吗?
答案 0 :(得分:0)
querydsl Q类是自动生成的类,它们将数据库表映射到类的Java表示形式(RelationalPathBase
),以便可以像数据库表一样查询它们,并具有使用querydsl' s的额外好处流畅的API /编译时类型安全等。
我想从示例中可以看到abstract class A
和class 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
)并执行逻辑以将行分成服务层中的不同类,之后数据已经退回。