Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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
Java 如果条件不适用于相关实体_Java_Spring_Jpa - Fatal编程技术网

Java 如果条件不适用于相关实体

Java 如果条件不适用于相关实体,java,spring,jpa,Java,Spring,Jpa,我试图对相关实体应用where条件,但结果集包含所有相关实体数据。看起来过滤器被忽略了。 我拥有以下实体: 实体审计: @Entity @Table(name = "entity_audit") @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @org.springframework.data.elasticsearch.annotations.Document(indexName = "e

我试图对相关实体应用where条件,但结果集包含所有相关实体数据。看起来过滤器被忽略了。 我拥有以下实体:

实体审计:

@Entity
@Table(name = "entity_audit")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@org.springframework.data.elasticsearch.annotations.Document(indexName = "entityaudit")
public class EntityAudit implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@org.springframework.data.elasticsearch.annotations.Field(type = FieldType.Keyword)
private Long id;

@NotNull
@Column(name = "entity_id", nullable = false)
private Long entityId;

@NotNull
@Column(name = "entity_class_name", nullable = false)
private String entityClassName;

@NotNull
@Column(name = "entity_name", nullable = false)
private String entityName;

@NotNull
@Enumerated(EnumType.STRING)
@Column(name = "action_type", nullable = false)
private EntityAuditType actionType;

@NotNull
@Column(name = "timestamp", nullable = false)
private Instant timestamp;

@NotNull
@Column(name = "user", nullable = false)
private String user;

@NotNull
@Column(name = "transaction_uuid", nullable = false)
private String transactionUuid;

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "entity_audit_id")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<EntityAuditUpdateData> entityAuditUpdateData = new HashSet<>();

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "entity_audit_id")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<EntityAuditStatus> entityAuditStatuses = new HashSet<>();

Getters and setters...
我正在尝试实现以下查询:

@Query("select distinct entityAudit from EntityAudit entityAudit " +
    "join entityAudit.entityAuditStatuses entityAuditStatus " +
    "where entityAuditStatus.userLogin =:userLogin " +
    "order by entityAudit.timestamp desc")
Page<EntityAudit> retrieveAllByUserLogin(@Param(value = "userLogin") String userLogin, Pageable pageable);
@Query(“从entityAudit entityAudit中选择不同的entityAudit”+
“加入entityAudit.entityAuditStatus entityAuditStatus”+
“其中entityAuditStatus.userLogin=:userLogin”+
“order by entityAudit.timestamp desc”)
页面检索allbyuserlogin(@Param(value=“userLogin”)字符串userLogin,可分页;

但是当我检索数据时,EntityAuditStatus不会被过滤。我不明白问题出在哪里。

注意:我从最小可复制示例中删除了日期属性

使用
left-join-fetch
而不是
left-join
来确保相关EntityAuditStatus是作为联接查询本身的一部分获取的,而不是在查找entityAudit后作为多个查询获取的。由于需要对结果进行分页,因此需要指定一个额外的countQuery(不带fetch)。工作查询-

@Query(value = "select entityAudit from EntityAudit entityAudit " +
            "left join fetch entityAudit.entityAuditStatuses entityAuditStatus " +
            "where entityAuditStatus.userLogin = :userLogin ",
       countQuery = "select entityAudit from EntityAudit entityAudit " +
            "left join entityAudit.entityAuditStatuses entityAuditStatus " +
            "where entityAuditStatus.userLogin = :userLogin ")
如果没有
left join fetch
,将生成三个查询-一个查询获取EntityAudited 1(基于用户登录名1),然后再生成两个查询获取EntityAuditStatus(仅从EntityAudit状态表中,不带连接),给定EntityAudited 1

这就是为什么,当您请求userLogin='1'时,您会检索EntityAudit 1,它附带了-entityAuditStatus 1-entityAuditStatus 3(它的userLogin='2')


添加
left join fetch
后,根据定义的实体关系,只有一个使用join的查询。这样就可以正确地获取结果。

这是一种双向关系吗?如果是,谁是关系所有者?尝试在
entityAudit
中添加
@OneToMany(mappedBy=“entityAudit”)
,并在
EntityAuditStatus
中使用
JoinColumn
详细信息添加
@manytone
。还要检查联接类型,无论您想要的是所有实体,而不管其处于审核状态,还是只想要具有审核状态的实体。添加mappedBy并从EntityAudit中删除JoinColumn,将其添加到EntityAuditStatus中,在保存包含EntityAuditStatus的EntityAudit对象时,EntityAuditStatus记录没有EntityAudit IDB,但它是否在EntityStatus相关表中添加了EntityAuditStatus相关ID?应该是相反的。EntityAudit ID应作为fk添加到EntityAuditStatus表中。在不更改JoinColumn和mappedBy的情况下,Hibernate查询:选择不同的entityaudi0.id作为id1\u 5\u,entityaudi0.action\u类型作为action\u t2\u 5\u,entityaudi0\u.entity\u类名作为entity\u c3\u 5\u,entityaudi0\u.entity\u id作为entity\u i4\u 5\u,entityaudi0\u.entity\u名称作为entity\u n5\u,entityaudi0\u.timestamp作为tim estam6\u,entityaudi0.transaction.uuid作为Transaction7.5,entityaudi0.user作为user8?按ent ityaudi0.timestamp desc limit订购?我刚刚得出了相同的结论。已测试并fetch+countQuery(因为已分页)修复了该问题。我将此标记为解决方案。非常感谢你!
@Query(value = "select entityAudit from EntityAudit entityAudit " +
            "left join fetch entityAudit.entityAuditStatuses entityAuditStatus " +
            "where entityAuditStatus.userLogin = :userLogin ",
       countQuery = "select entityAudit from EntityAudit entityAudit " +
            "left join entityAudit.entityAuditStatuses entityAuditStatus " +
            "where entityAuditStatus.userLogin = :userLogin ")