QueryDSL生成的类无法访问用于查询的二级元素

时间:2011-06-17 11:24:08

标签: java spring querydsl spring-data

我在Java Project中使用带有Spring Data JPA的QueryDSL,并使用QueryDSL maven插件生成文件,以使用它生成的QueryDSL Model类。当我将它用于一个级别的嵌套对象时,这非常有用,但是如果我尝试访问第二级访问对象,则会产生NullPointerException,从而无法初始化第二级模型对象。

会感激一些帮助。

我在第3行获得NullPointerException qmachine.vendor为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;
}

,供应商类是

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

}

我故意省略了吸气剂和二传手。

2 个答案:

答案 0 :(得分:14)

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

最终字段无法进行全深度初始化,因为可能存在无限循环,但Querydsl也提供了属性访问器方法的选项。

答案 1 :(得分:0)

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