【问题标题】:How to select row from table based on foreign key value using Hibernate (Spring)如何使用Hibernate(Spring)根据外键值从表中选择行
【发布时间】:2018-02-20 20:01:17
【问题描述】:

我想获取 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;
}

这是我的 KotizacijeCjenovnikRepository

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

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

【问题讨论】:

    标签: java spring hibernate


    【解决方案1】:

    您在KotizacijeCjenovnik 实体中将您的ID 指定为Long,但您将查询传递给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);
    

    【讨论】:

    • 谢谢,这解决了我的问题。我还必须像@christoph-j 建议的那样转换 id.longValue() 。
    【解决方案2】:

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

    List&lt;...&gt; findAllByKotizacijeId(Long id);

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

    【讨论】:

      【解决方案3】:

      似乎 Kotizacija 的 id 是 long 而不是 BigInteger,但您可以指定 Kotizacija直接代替它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);
      }
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2020-10-14
          • 1970-01-01
          • 2019-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多