Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot QueryDsl BooleanExpression-嵌套字段为空_Spring Boot_Querydsl - Fatal编程技术网

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;

}