我有一个带有实体@Transient 字段的实体,当我运行查询时出现错误。
查询与实体瞬时字段有连接
@Entity
@Table(name = "OTHER")
public class OtherEntity implements Serializable {
@Id
private Long id
@Column( name = "code" )
private String code;
}
@Entity
@Table(name = "MARKER")
public class MarkerEntity implements Serializable {
@Id
private Long id
@Column(name = "OTHER_FIELD")
private Long otherId;
@Transient
private OtherEntity other;
public MarkerEntity(Long otherId, OtherEntity other) {
this.otherId = otherId;
this.other = other;
}
}
这是 jpa 查询
@Query("SELECT " +
"new MarkerEntity(" +
" o.id, " +
" new OtherEntity(o.id, o.code)" +
") m " +
"JOIN OtherEntity o")
public List<MarkerEntity> entities(@Param("id") Long id)
当您尝试将 OtherEntity 与 MarkerEntity 中的瞬时 other 字段连接时,JPA 会抛出错误,因为它不知道如何处理此瞬时关联。您可以使用 @ManyToOne 定义 MarkerEntity 和 OtherEntity 之间的关系,而不是使用 @Transient 字段。这样,JPA 就可以自然地处理连接,而无需瞬时字段。
@Entity @Table(name = "OTHER") public class OtherEntity implements Serializable { @Id private Long id; @Column(name = "code") private String code; // 为 JPA 添加默认构造函数 public OtherEntity() {} public OtherEntity(Long id, String code) { this.id = id; this.code = code; } // Getters 和 Setters }
@Entity @Table(name = "MARKER") public class MarkerEntity implements Serializable { @Id private Long id; @Column(name = "OTHER_FIELD", insertable = false, updatable = false) private Long otherId; @ManyToOne @JoinColumn(name = "OTHER_FIELD", referencedColumnName = "id") private OtherEntity other; public MarkerEntity() {} public MarkerEntity(Long otherId, OtherEntity other) { this.otherId = otherId; this.other = other; } // Getters and Setters } 设置这种关系后,您的查询可以简化如下
@Query("SELECT new MarkerEntity(m.other.id, m.other) FROM MarkerEntity m WHERE 在此处输入代码m.id = :id")? public List entities(@Param("id") Long id);
此处的问题是由于在 MarkerEntity 中的 OtherEntity 字段上使用 @Transient 造成的。在 JPA 中,@Transient 字段会被持久化忽略,这意味着 JPA 不会直接管理或填充它们。因此,尝试在 MarkerEntity 上的 JPA 查询中引用 OtherEntity 可能会导致问题,因为 JPA 不知道如何处理或检索这种临时关系。
要解决此问题,您有两个主要选择:
使用 ManyToOne 关系代替 @Transient 将 @Transient 替换为 MarkerEntity 和 OtherEntity 之间的 @ManyToOne 关系。这样,JPA 将识别该关系,您可以在查询中使用它。以下是修改类的方法:
然后,按如下方式更新查询: