如何使用spring CrudRepository仅选择特定字段?

时间:2015-09-03 14:46:55

标签: java spring hibernate spring-data spring-data-jpa

如何只选择以下类层次结构中的特定字段?

@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

2 个答案:

答案 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延迟关联。