QueryDSL 生成的类无法访问二级元素进行查询

Posted

技术标签:

【中文标题】QueryDSL 生成的类无法访问二级元素进行查询【英文标题】:QueryDSL Generated classes not able to access second level elements for querying 【发布时间】:2011-09-17 02:54:51 【问题描述】:

我在我的 Java 项目中使用带有 Spring Data JPA 的 QueryDSL,并使用 QueryDSL maven 插件生成的文件来使用它生成的 QueryDSL 模型类。当我将它用于一级嵌套对象时,这很有效,但是如果我尝试访问二级访问对象,它会给出一个 NullPointerException 保存二级模型对象未初始化。

不胜感激。

我在第 3 行收到 NullPointerException qmachine.vendor is null。

QTransaction qtransaction = QTransaction.transaction;
QMachine qmachine = qtransaction.machine;
BooleanExpression vendorexp = qmachine.vendor.vendor.eq(machineType);

我的映射类如下: 交易

@Entity
@Table(name = "dsdsd")
public class Transaction extends AbstractPersistable<Long> 

    private static final long serialVersionUID = 1L;

    @ManyToOne
    @JoinColumn(name = "machine_id")
    private Machine machine;


机器类是:

@Entity
@Table(name="machine")
public class Machine extends AbstractPersistable<Long> 

    private static final long serialVersionUID = 1L;

    @ManyToOne
    @JoinColumn(name="vendor_id")
    private Vendor vendor;

Vendor 类是

@Entity
@Table(name="vendors")
public class Vendor extends AbstractPersistable<Long> 

    private static final long serialVersionUID = 1L;

    @Column(name="vendor")
    @Enumerated(EnumType.STRING)
    private VendorType vendor;


我故意省略了 getter 和 setter。

【问题讨论】:

你能发布堆栈跟踪吗? 添加了代码。堆栈跟踪只是 qmachine.vendor.vendor 的 NullPointerException 【参考方案1】:

默认情况下只有第一层被初始化。有关初始化选项,请参阅此文档部分:http://www.querydsl.com/static/querydsl/3.6.0/reference/html/ch03s03.html#d0e2192

由于可能存在无限循环,因此无法对 final 字段进行完全深度初始化,但 Querydsl 还提供了属性访问器方法的选项。

【讨论】:

【参考方案2】:

http://www.querydsl.com/static/querydsl/2.2.4/reference/html/ch03s02.html

您需要在 Transaction.machine 属性上使用 @QueryInit("vendor.vendor")

@Entity
@Table(name = "dsdsd")
public class Transaction extends AbstractPersistable<Long> 

    private static final long serialVersionUID = 1L;

    @ManyToOne
    @JoinColumn(name = "machine_id")
    @QueryInit("vendor.vendor")
    private Machine machine;


https://github.com/querydsl/querydsl/issues/2129

【讨论】:

以上是关于QueryDSL 生成的类无法访问二级元素进行查询的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JPA中使用QueryDSL进行查询

使 JPQL/QueryDSL 不会产生可怕的查询

QueryDSL 注释处理器和 gradle 插件

在Java中查询类似DSL的机制以进行运行时sql绑定

Q开头的类找不到,无法加载插件:com.mysema.maven:apt-maven-plugin

Spring data mongodb querydsl 环境配置