12

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

将不胜感激一些帮助。

我在第 3 行收到 NullPointerException qmachine.vendor 为空。

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;
}

供应商类是

@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。

4

2 回答 2

16

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

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

于 2011-06-27T10:39:10.697 回答
1

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

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

@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

于 2021-04-12T16:37:51.873 回答