如何使用Hibernate(Spring)基于外键值从表中选择行

时间:2018-02-20 20:01:17

标签: java spring hibernate

我想得到kotizacija_id等于指定ID的所有行。这是我在Controller中的功能

  @GetMapping("/kotizacije_cjenovnik/{id}")
  @Timed
    public List<KotizacijeCjenovnik> getKotizacijeByKotizacijaId(@PathVariable BigInteger id) {
    log.debug("REST request to get Kotizacija : {}", id);
    List<KotizacijeCjenovnik> kotizacija_cjenovnik = kotizacijaCjenovnik.getKotizacijeByKotizacijaId(id);
    return kotizacija_cjenovnik;
}

这是我的KotizacijeCjenovnik存储库

@SuppressWarnings("unused")
@Repository
public interface KotizacijeCjenovnikRepository extends 
JpaRepository<KotizacijeCjenovnik, BigInteger> {
@Query(value="select kotizacije_cjenovnik from KotizacijeCjenovnik kotizacije_cjenovnik where kotizacije_cjenovnik.kotizacija.id =:id")
List<KotizacijeCjenovnik> getKotizacijeByKotizacijaId(@Param("id") BigInteger id);

 }

这里的模特KotizacijeCjenovnik

@Entity
@Table(name = "kotizacije_cjenovnik")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class KotizacijeCjenovnik implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "cijena1", nullable = false)
private Double cijena1;

@ManyToOne
private Kotizacija kotizacija;

// jhipster-needle-entity-add-field - JHipster will add fields here, do not remove
public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

private Double getCijena1() {
    return cijena1;
}

public KotizacijeCjenovnik cijena1(Double cijena) {
    this.cijena1 = cijena;
    return this;
}

public void setCijena1(Double cijena) {
    this.cijena1 = cijena;
}


public Kotizacija getKotizacija() {
    return kotizacija;
}

public KotizacijeCjenovnik kotizacija(Kotizacija kotizacija) {
    this.kotizacija = kotizacija;
    return this;
}

public void setKotizacija(Kotizacija kotizacija) {
    this.kotizacija = kotizacija;
}

@Override
public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (o == null || getClass() != o.getClass()) {
        return false;
    }
    KotizacijeCjenovnik kotizacijeCjenovnik = (KotizacijeCjenovnik) o;
    if (kotizacijeCjenovnik.getId() == null || getId() == null) {
        return false;
    }
    return Objects.equals(getId(), kotizacijeCjenovnik.getId());
}

@Override
public int hashCode() {
    return Objects.hashCode(getId());
}

@Override
public String toString() {
    return "KotizacijeCjenovnik{" +
        "id=" + getId() +
        ", cijena1=" + getCijena1() +
        ", cijena2=" + getCijena2() +
        ", cijena3=" + getCijena3() +
        "}";
    }
}

但是当我调用函数getKotizacijeByKotizacijaId时,我收到错误:

  

参数值[1]与预期类型[java.lang.Long(n / a)]不匹配;嵌套异常是java.lang.IllegalArgumentException:参数值[1]与期望类型[java.lang.Long(n / a)]

不匹配

我的问题是如何选择外键等于指定值的行。

4 个答案:

答案 0 :(得分:2)

您已将自己的ID指定为Long KotizacijeCjenovnik个实体,但是您将查询传递给BigInteger

将其从BigInteger更改为Long

@Query(value="select kotizacije_cjenovnik from KotizacijeCjenovnik kotizacije_cjenovnik where kotizacije_cjenovnik.kotizacija.id =:id")
List<KotizacijeCjenovnik> getKotizacijeByKotizacijaId(@Param("id") Long id);

答案 1 :(得分:2)

Entity中,您说id属于Long类型。在你的repository中,你说它是一个BigInteger。您应该在存储库中使用Long。对于方法,它应该是

List<...> findAllByKotizacijeId(Long id);

使用JPA时,您不必编写查询

答案 2 :(得分:1)

错误消息显示您使用了错误的类型。它预计很长,但你传入了一个BigInteger。尝试:

List<KotizacijeCjenovnik> kotizacija_cjenovnik = kotizacijaCjenovnik.getKotizacijeByKotizacijaId(id.longValue());

答案 3 :(得分:1)

似乎 Kotizacija 的ID 而不是 BigInteger ,但您可以指定 Kotizacija < / strong>直接代替 id 。 控制器:

@GetMapping("/kotizacije_cjenovnik/{id}")
@Timed
public List<KotizacijeCjenovnik> getKotizacijeByKotizacijaId(@PathVariable BigInteger id) {
    log.debug("REST request to get Kotizacija : {}", id);
    Kotizacija kotizacija = new Kotizacija();
    kotizacija.setId(id);
    List<KotizacijeCjenovnik> kotizacija_cjenovnik = kotizacijaCjenovnik.getKotizacijeByKotizacija(kotizacija);
    return kotizacija_cjenovnik;
}

存储库:

@SuppressWarnings("unused")
@Repository
public interface KotizacijeCjenovnikRepository extends 
    JpaRepository<KotizacijeCjenovnik, BigInteger> {
    @Query(value="select kotizacije_cjenovnik from KotizacijeCjenovnik kotizacije_cjenovnik where kotizacije_cjenovnik.kotizacija = :kotizacija")
    List<KotizacijeCjenovnik> getKotizacijeByKotizacija(@Param("kotizacija") Kotizacija kotizacija);
}