12

Java プロジェクトで Spring Data JPA で QueryDSL を使用しており、QueryDSL maven プラグインを使用してファイルを生成し、それによって生成された QueryDSL モデル クラスを使用しています。これは、1 レベルのネストされたオブジェクトに使用するとうまく機能しますが、第 2 レベルのアクセス オブジェクトにアクセスしようとすると、第 2 レベルのモデル オブジェクトが初期化されていないことを保存する NullPointerException が発生します。

助けていただければ幸いです。

3 行目の qmachine.vendor is null で NullPointerException が発生しています。

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;

}

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;

}

意図的にゲッターとセッターを省略しました。

4

2 に答える 2

16

デフォルトでは、最初のレベルのみが初期化されます。初期化オプションについては、このドキュメント セクションを参照してください: http://www.querydsl.com/static/querydsl/3.6.0/reference/html/ch03s03.html#d0e2192

無限ループが発生する可能性があるため、最終フィールドを完全に深い初期化することはできませんが、Querydsl はプロパティ アクセサー メソッドのオプションも提供します。

于 2011-06-27T10:39:10.697 に答える