spring数据分页和复合键,在不知情的情况下休眠

时间:2018-07-19 02:06:10

标签: hibernate jpa spring-data-jpa

我对某些实体使用IdClass

无法解析属性:sampleYear of:com.lcm.model.Samples

public class SamplingsPK implements Serializable {

    private int year; 
    private Integer id;

    public SamplingsPK(int year, Integer id) {
        this.id = id;
        this.year=year;
    }
    ..
}


public class SamplesPK implements Serializable {

    private SamplingsPK sampling;
    private String sampleLetter;

    public SamplesPK(SamplingsPK sampling, String sampleLetter) {
        this.sampling = sampling;
        this.sampleLetter = sampleLetter;
    }
    ...
}

@Entity
@IdClass(SamplesPK.class)
public class Samples {
    @Id
    private String sampleLetter;

    @Id
    @ManyToOne(optional=false)
    @JoinColumns({
        @JoinColumn(name = "sampling_id", referencedColumnName = "id"),
        @JoinColumn(name = "sampling_year", referencedColumnName = "year")})
    private Samplings sampling;
    ....
}

@Entity
@IdClass(SamplingsPK.class)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Samplings {
    @Id
    private Integer year;

    @Id
    @GeneratedValue
    private Integer id;
    ...
}

运行此查询时

@Query(
  value = "select s from Samples s Join fetch s.sampling sp Join  fetch sp.machine m Join  fetch sp.product p Join  fetch p.productType",
  countQuery = "select count(s) from Samples s Join s.sampling sp Join  sp.machine m Join  sp.product p Join  p.productType")
    public Page<Samples> findAllFullSample(Pageable pageable);

和Pageable包含这三个字段

  • samplingYear
  • samplingId
  • sampleLetter

我明白了

  

org.hibernate.QueryException:无法解析属性:sampleYear   of:com.lcm.model.Samples

在示例中,我有Samplings类,因此我需要通过对象名称传递访问Year和Id ...

为什么该字段未知?

编辑

如果我使用 id,请年份sampleLetter

select 
    samples0_.sample_letter as sample_l1_20_0_,
    ....
from
        samples samples0_ 
    inner join
        samplings samplings1_ 
            on samples0_.sampling_id=samplings1_.id 
            and samples0_.sampling_year=samplings1_.year 
    order by
        samples0_.sampling_year asc,
        samples0_.sample_letter,
        samples0_.sampling_id,
        samples0_.sampling_year asc,
        samples0_.sample_letter asc limit ?

他们添加了更多字段,然后按顺序排序...

1 个答案:

答案 0 :(得分:1)

  

为什么此字段未知?

您没有在任何地方声明samplingYear。它只会出现在错误消息和Pageable的描述中,而不会出现在您的实体或您的id类中。

也许您是说sampling.year