JPQL中的组合键查询未正确生成

时间:2018-08-01 19:17:01

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

我使用spring数据jpa,并且使用组合键

Startup.cs

我尝试使用复合键搜索示例

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

    @Embedded
    private TestSamples testSamples;

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

    //get set

}

public class SamplesPK implements Serializable {

    private SamplingsPK sampling;

    private String sampleLetter;

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

        //get set
}


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

    @Id
    @GeneratedValue
    private Integer id;

    @OneToMany(mappedBy = "sampling", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Samples> samples = new ArrayList<>();

    //get set

}   

public class SamplingsPK implements Serializable {

    private int year;

    private Integer id;

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

我收到此错误

  

java.lang.IllegalArgumentException:参数值[2]不匹配   预期的类型[com.lcm.model.SamplesPK(n / a)]

修改

我将查询修改为

@Query(value = "select s from Samples s Join fetch s.sampling sp Join fetch sp.product p Join fetch p.productType Join Fetch s.testSamples.compressionTest where s.id=:id and s.year=:year and s.sampleLetter=:sampleLetter and sp.id=:id and sp.year=:year")
public Samples findSamplesWithFullProductAndTest(@Param("id") Integer id, @Param("year") Integer year,  @Param("sampleLetter") String sampleLetter);

但是我得到这个错误

  

org.postgresql.util.PSQLException:错误:运算符不存在:   record =整数索引:没有运算符匹配给定名称,并且   参数类型。您可能需要添加显式类型转换。

生成的查询是

select s from Samples s Join fetch s.sampling sp Join fetch sp.product p Join fetch p.productType Join Fetch s.testSamples.compressionTest where s.sampling.id=:id and s.sampling.year=:year and s.sampleLetter=:sampleLetter and sp.id=:id and sp.year=:year

编辑2

select
        samples0_.sample_letter as sample_l1_20_0_,
        samples0_.sampling_id as sampling0_20_0_,
        samplings1_.id as id2_21_1_,
        samplings1_.year as year3_21_1_,
        products2_.id as id2_15_2_,
        producttyp3_.id as id1_16_3_,
        compressio4_.id as id1_3_4_,
        samples0_.sampling_id as samplin27_20_0_,
        samples0_.sampling_year as samplin28_20_0_,
        samples0_.compression as compres18_20_0_,
        samples0_.compression_number as compres19_20_0_,
        samples0_.compression_test_id as compres29_20_0_,
        samplings1_.available_for_test as availabl4_21_1_,
        samplings1_.dtype as dtype1_21_1_,
        products2_.created_at as created_3_15_2_,
        products2_.updated_at as updated_4_15_2_,
        products2_.name_en as name_en5_15_2_,
        products2_.dtype as dtype1_15_2_,
        producttyp3_.created_at as created_2_16_3_,
        producttyp3_.updated_at as updated_3_16_3_,
        producttyp3_.name_en as name_en4_16_3_,
        compressio4_.created_at as created_2_3_4_,
        compressio4_.updated_at as updated_3_3_4_
    from
        permacon.samples samples0_ 
    inner join
        permacon.samplings samplings1_ 
            on samples0_.sampling_id=samplings1_.id 
            and samples0_.sampling_year=samplings1_.year 
    inner join
        permacon.products products2_ 
            on samplings1_.product_id=products2_.id 
    inner join
        permacon.product_types producttyp3_ 
            on products2_.product_type_id=producttyp3_.id 
    inner join
        permacon.compressions compressio4_ 
            on samples0_.compression_test_id=compressio4_.id 
    where
        (
            samples0_.sampling_id, samples0_.sampling_year
        )=? 
        and samplings1_.year=? 
        and samples0_.sample_letter=? 
        and samplings1_.id=? 
        and samplings1_.year=?

使用继承是因为我有两个扩展采样的表

1 个答案:

答案 0 :(得分:0)

you year字段是int而不是Integer的

findSamplesWithFullProductAndTest

方法

相关问题