java.lang.NullPointerException: 使用 QueryDsl 过滤数据时 [英] java.lang.NullPointerException: while filtering data using QueryDsl

查看:42
本文介绍了java.lang.NullPointerException: 使用 QueryDsl 过滤数据时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 Spring 数据 jpa 来创建服务.在以下代码中,我使用 Querydsl 在网格上实现搜索过滤器.但是对于建筑物名称,我无法过滤网格.我得到 java.lang.NullPointerException: null.

对于网格数据来自多个表.我没有为此使用加入.我将模型类相互映射

@Service公共类 RoomTransferService {@自动连线RoomTransferRepository roomTransferRepo;@PersistenceContextEntityManager em;公共列表findRoomTransfer(字符串sStatus,字符串sBuildName,字符串deptFrom,字符串deptTo){QroomTransfer roomTransfer = QroomTransfer.roomTransfer;JPAQueryquery = new JPAQuery(em);query.from(roomTransfer);//过滤细节如果(sStatus != null){query.where(roomTransfer.sStatus.eq(sStatus));}//不过滤if(sBuildName !=null) {query.where(roomTransfer.roomDeptMap.room.building.sBuildName.eq(sBuildName));}列表<房间接送>QueryResultRoomTramsfer=query.fetch();返回 QueryResultRoomTramsfer;

房间等级

@Entity@Table(name = "房间")@JsonInclude(JsonInclude.Include.NON_NULL)公共类 Room 实现了 Serializable {private static final long serialVersionUID = 1L;@ID@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "room_seq_generator")@SequenceGenerator(name = "room_seq_generator", sequenceName = "room_seq")@Column(name = "nroom_id")公共整数 nRoomId;@Column(name = "ncampus_id")公共整数 nCampusId;@Column(name = "nbuild_id")公共整数 nBuildId;@Column(name = "ninst_id")公共整数 nInstId;@Column(name = "sfloor")公共字符串sFloor;@Column(name = "sroom_number")公共字符串sRoomNumber;@Column(name = "sroom_desc")公共字符串 sRoomDesc;@Column(name = "评论")公共字符串评论;@Column(name = "daccepted_date")公共时间戳 dAcceptedDate;@Column(name = "ssurveyor")公共字符串sSurveyor;@Column(name = "narea")公共整数 nArea;@Column(name = "ncrt_code_id")公共整数 nCRTCodeId;@Column(name = "ncmn_room_bln")公共整数 nCMNroomBln;@Column(name = "nunvalidated_bln")公共整数 nUnvalidatedBln;@Column(name = "sbfr_field")公共字符串 sBfrField;@Column(name = "ntemp_room_id")公共整数 nTempRoomId;@Column(name = "bis_active")公共布尔 bIsActive;@Column(name = "bis_jointuse")公共布尔 bIsJointuse;@Column(name = "sstations_desc")公共字符串 sStationDesc;@Column(name = "ddeleted_on")公共时间戳 dDeletedOn;@Column(name = "ndeleted_by")公共整数 nDeletedBy;@Column(name = "bis_incluster")公共布尔 bIsIncluster;@Column(name = "bis_service_center_activity")公共布尔 bisServiceCenterActivity;@Column(name = "service_center_comments")public String serviceCenterComments;@ManyToOne(可选=真)@JoinColumn(name = "nbuild_id", insertable = false, updatable = false)公共建筑;

解决方案

你得到的 NPE 可能与 QueryDsl 的限制有关,你不能超过四个级别.

您的代码超过四个级别.

roomTransfer.roomDeptMap.room.building.sBuildName

您可以在官方文档 或相关的 stackoverflow 的问题..>

在第一个链接中,有一个使用 QueryInit 注释来解决这个问题的解决方案.

如果您不想更改实体类,您可以使用前 2 或 3 级的别名执行连接(如果可能),然后使用此别名完成查询.

I am using Spring data jpa for creating service. In following code I am using Querydsl for implementing search filter on grid. But for building name I am not able to filter the grid. I am getting java.lang.NullPointerException: null.

For grid data is coming from multiple tables. I am not using joining for that. I mapped models classes with each other

@Service
public class RoomTransferService {

    @Autowired
    RoomTransferRepository roomTransferRepo;

    @PersistenceContext
    EntityManager em;

    public List<RoomTransfer> findRoomTransfer(String sStatus, String sBuildName, String deptFrom, String deptTo) {

        QRoomTransfer roomTransfer = QRoomTransfer.roomTransfer;

        JPAQuery<RoomTransfer> query = new JPAQuery<RoomTransfer>(em);

        query.from(roomTransfer);

        // filter the details
        if (sStatus != null) {          
            query.where(roomTransfer.sStatus.eq(sStatus));
        }

        // not filtering
        if(sBuildName !=null) {     

            query.where(roomTransfer.roomDeptMap.room.building.sBuildName.eq(sBuildName));
        }
       List<RoomTransfer> QueryResultRoomTramsfer=query.fetch();
       Return QueryResultRoomTramsfer;

Room class

@Entity
@Table(name = "room")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Room implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "room_seq_generator")
    @SequenceGenerator(name = "room_seq_generator", sequenceName = "room_seq")
    @Column(name = "nroom_id")
    public Integer nRoomId;

    @Column(name = "ncampus_id")
    public Integer nCampusId;

    @Column(name = "nbuild_id")
    public Integer nBuildId;

    @Column(name = "ninst_id")
    public Integer nInstId;

    @Column(name = "sfloor")
    public String sFloor;

    @Column(name = "sroom_number")
    public String sRoomNumber;

    @Column(name = "sroom_desc")
    public String sRoomDesc;

    @Column(name = "scomments")
    public String sComments; 

    @Column(name = "daccepted_date")
    public Timestamp dAcceptedDate;

    @Column(name = "ssurveyor")
    public String sSurveyor;

    @Column(name = "narea")
    public Integer nArea;

    @Column(name = "ncrt_code_id")
    public Integer nCRTCodeId;

    @Column(name = "ncmn_room_bln")
    public Integer nCMNRoomBln;

    @Column(name = "nunvalidated_bln")
    public Integer nUnvalidatedBln;

    @Column(name = "sbfr_field")
    public String sBfrField;

    @Column(name = "ntemp_room_id")
    public Integer nTempRoomId;

    @Column(name = "bis_active")
    public Boolean bIsActive;

    @Column(name = "bis_jointuse")
    public Boolean bIsJointuse;

    @Column(name = "sstations_desc")
    public String sStationsDesc;

    @Column(name = "ddeleted_on")
    public Timestamp dDeletedOn;

    @Column(name = "ndeleted_by")
    public Integer nDeletedBy;

    @Column(name = "bis_incluster")
    public Boolean bIsIncluster;

    @Column(name = "bis_service_center_activity")
    public Boolean bisServiceCenterActivity;

    @Column(name = "service_center_comments")
    public String serviceCenterComments;

    @ManyToOne(optional = true)
    @JoinColumn(name = "nbuild_id", insertable = false, updatable = false)
    public Building building;

解决方案

The NPE that you get is probably related to the limitation of QueryDsl where you cannot exceed four levels.

Your code exceeds four levels.

roomTransfer.roomDeptMap.room.building.sBuildName

You can read more on official documentation or related stackoverflow's question.

In the first link there is a solution to overcome this issue using QueryInit annotation.

If you do not want to alter your entity class you can perform a join (if possible) with an alias for the first 2 or 3 levels and then use this alias to complete the query.

这篇关于java.lang.NullPointerException: 使用 QueryDsl 过滤数据时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆