我在使用投影界面时遇到问题。因为我有一个复杂的实体,该实体具有递归的OneToMany映射。因此,它影响了查询的性能。因此,我试图仅从数据库中获取必要的字段并将其映射到DTO。 构造函数映射不能使用,因为它不支持递归值。因此,首选使用接口投影。
@Entity
@Table(name = "cons")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class C implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn(name = "o_id")
private O o;
}
@Entity
@Table(name = "o")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class O implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "o_name")
private String oName;
}
public interface CustomCRepository extends CrudRepository<C, Long> {
@Query("select c.id,o.id" +
" from C c LEFT JOIN c.o o LEFT JOIN " +
" where c.cId IN (:cIds)")
public List<CInfoInterface> findAllByConsignmentIdIn(@Param("cIds")
List<String> cId);
}
public interface CInfoInterface {
public Long getId();
public OSummary getOs();
public interface OrdersSummary{
public String getOId();
}
}
当我尝试通过以下代码访问查询结果时,它将引发classCastException(引起原因:java.lang.ClassCastException:[Ljava.lang.Object;无法转换为CInfoInterface)。
CInfoInterface和实体C在同一包中。 您能否请某人帮助我找出问题所在或实现此目的的实际步骤是什么,目的是仅查询实体的一部分并将其映射到DTO。 先感谢您。