Spring boot QueryDsl BooleanExpression-嵌套字段为空
我想用Spring boot QueryDsl BooleanExpression-嵌套字段为空,spring-boot,querydsl,Spring Boot,Querydsl,我想用QueryDSL创建一个谓词,我不知道为什么,但某些嵌套字段为空: BooleanExpression emailSender = qFreight.message.account.user.id.eq(userId); 用户为空 qFreight.message.account.user给我NPE错误 然后在我的日志中 .180 ERROR 7316 --- [nio-9090-exec-3] p.a.m.s.filter.JwtAuthorizationFilter : Re
QueryDSL
创建一个谓词,我不知道为什么,但某些嵌套字段为空:
BooleanExpression emailSender = qFreight.message.account.user.id.eq(userId);
用户为空
qFreight.message.account.user
给我NPE错误
然后在我的日志中
.180 ERROR 7316 --- [nio-9090-exec-3] p.a.m.s.filter.JwtAuthorizationFilter : Request processing failed; nested exception is java.lang.NullPointerException
当然,我已经生成了QFreight
,QMessage
,QAccount
,QUser
。。。问题在哪里?我不知道
更新
我的实体(问题是如何正确设置@QueryInit):
qFreight.message.account.user.id
不是有效的JPQL表达式。您必须在实体之间显式创建联接:JOIN qFreight.message JOIN message.account JOIN account.user
。在QueryDSL中,这将是:.join(qFreight.message,QMessage.message).join(QMessage.message.account,QAccount.account.account).join(QAccount.account.user,QUser.user).where(QUser.user.id.eq(…)
此外,默认情况下,QueryDSL元模型仅初始化一级深度。这是一个性能决定。如果您需要对元模型进行更深层次的初始化(即使用例很少,因为JPQL不支持隐式联接),您必须使用
@QueryInits
:如何在布尔表达式中使用联接?这是不可能的。连接需要应用于查询本身。您可能需要研究blaze persistence querydsl
集成,它确实带来了隐式连接,这将允许您编写qFreight.message.account.user.id
(假设您为它设置了正确的@QueryInits
):我安装了blaze persistence integration querydsl表达式和添加的实体。你能帮我做@QueryInit吗?这对我不起作用。。。您的意思是,在安装blaze持久性集成querydsl表达式之后,我可以使用qFreight.message.account.user.id.eq(userId);???
@Entity
@Table(name = "freight")
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Freight {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false, updatable = false)
private Long id;
@QueryInit("*")
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "message_id")
private Message message;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
}
@Entity
@Table(name="message")
@Getter
@Setter
public class Message {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false, updatable = false)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "email_account_id", foreignKey = @ForeignKey(name = "FK_account_to_message"))
private Account account;
}
@Entity
@Table(name="account")
@Getter
@Setter
@NoArgsConstructor
@SuperBuilder(builderMethodName = "of")
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false, updatable = false)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
private User user;
}