【问题标题】:Composite key query in JPQL not generated correctlyJPQL 中的复合键查询未正确生成
【发布时间】:2019-01-09 11:14:22
【问题描述】:

我使用spring data jpa,我使用复合键

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

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

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

我收到此错误

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

编辑,

我将查询修改为

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

但我收到此错误

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

生成的查询是

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=?

编辑 2

@MappedSuperclass
public abstract class BaseEntity {

    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
    //get set...
}

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

【问题讨论】:

  • 您能否提供 BaseClass 的定义。从上面的代码也不清楚为什么使用'@Inheritance(strategy = InheritanceType.SINGLE_TABLE)'。
  • 我提供了信息

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


【解决方案1】:

你的年份字段是 int put int 而不是 Integer 在你的

findSamplesWithFullProductAndTest

方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 2021-04-06
    • 2019-09-11
    • 2014-05-04
    相关资源
    最近更新 更多