java.lang.NullPointerException: 使用 QueryDsl 过滤数据时 [英] java.lang.NullPointerException: while filtering data using 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屋!