【问题标题】:How to select only specific fields using spring CrudRepository?如何使用 spring CrudRepository 仅选择特定字段?
【发布时间】:2015-11-29 11:31:00
【问题描述】:

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

@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);
}

这很好用,只是性能很差,因为 MyEntityPerson 有一些我想防止在这种特定情况下被获取的字段和关联(例如 clob/texts)。

问题:我如何编写此查询来查找结果集,并且只获取绝对需要的字段(假设 id, fieldA, fieldB 来自 MyEntity

【问题讨论】:

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


    【解决方案1】:

    对非必要字段使用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
    

    【讨论】:

      【解决方案2】:

      将不需要的字段标记为惰性字段(但请注意 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 惰性关联。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-16
        • 1970-01-01
        • 1970-01-01
        • 2017-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多