如何只选择以下类层次结构中的特定字段?
@Entity
public class MyEntity {
@Id private Long id;
@ManyToOne
@JoinColumn(name="fk_person_id", foreignKey = @ForeignKey(name="fk_person"))
private Person person; //unidirectional
private String fieldA, fieldB, ..field M;
//many more fields and some clobs
}
@Entity
public class Person {
@Id private Long id;
private String firstname;
private String lastname;
}
interface MyEntityRepository extends CrudRepository<MyEntity, Long> {
List<MyEntity> findByIdAndPersonFirstnameAndPersonLastname(long id, String firstname, String lastname);
}
这很有效,只是性能非常差MyEntity
而且Person
有一些字段和关联,我想阻止在这种特定情况下获取(例如clob /文本)
问题:如何编写此查询以查找结果集,只需获取绝对必需的字段(让我们假设id, fieldA, fieldB
中的MyEntity
?
答案 0 :(得分:0)
将lazy initialization用于非必要字段:
FetchType.LAZY
=除非通过getter FetchType.EAGER
=加载所有关系例如,在Person
:
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="fk_person_id", foreignKey = @ForeignKey(name="fk_person"))
private Person person; //unidirectional
答案 1 :(得分:0)
将不需要的字段标记为懒惰(请注意this documented warning),或创建包含所需属性的专用类,并在查询中使用投影:
select new com.foo.bar.MyEntityWithFirstNameAndLastName(m.id, person.firstname, person.lastname)
from MyEntity m
join m.person person
where ...
如果Person是一个经常使用的实体,并且包含很少被提取的大blob,你应该考虑将blob存储在一个单独的实体中,并使用OneToOne延迟关联。