【问题标题】:How to query join table with jpa crud repository如何使用 jpa crud 存储库查询连接表
【发布时间】:2021-04-06 07:28:30
【问题描述】:

如何查询计费方案实体,例如按时间返回计费?

这是我的两个实体类。

*编辑 添加了我的测试代码,两种解决方案都为我返回 null 我做错了吗?不过我觉得我越来越近了!

@Entity
public class Charge {

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private  Long id;
    private LocalTime time;
    private double rate;
    @ManyToOne
    @JoinColumn(name="cs_id", nullable=false)
    private ChargeScheme chargeScheme;
}


@Entity
public class ChargeScheme implements Serializable {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name="cs_id")
    private  Long id;

    @OneToMany(mappedBy="chargeScheme")
    private Set<Charge> charges;
}

 Set<Charge> charges = new HashSet<>();
        try (BufferedReader br = new BufferedReader(new FileReader("FILE"))) {
            String line;
            while ((line = br.readLine()) != null) {
                String[] values = line.split(COMMA_DELIMITER);
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
                LocalTime time = LocalTime.parse(values[0], formatter);
                double rate = Double.parseDouble(values[1]);
                Charge charge = new Charge(chargeScheme);
                charge.setTime(time);
                charge.setRate(rate);
                charges.add(charge);
            }
            //set charges
            LocalTime time = LocalTime.of(4,0,0);
            chargeScheme.setChargeScheme(charges);
            chargeSchemeRepository.save(chargeScheme);
            Optional<Charge> opt = chargeSchemeRepository.findAllByCharges_TimeGreaterThan(time);
            Optional<ChargeScheme> opt2 = chargeSchemeRepository.findByChargesTimeGreaterThan(time);
            List<ChargeScheme> chargescheme = chargeSchemeRepository.findAll();
            ChargeScheme scheme = chargescheme.get(0);
            Set<Charge> cur_charges = scheme.getChargeScheme();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

【问题讨论】:

  • 您的代码缺少级联,没有任何费用保存在此行 chargeSchemeRepository.save(chargeScheme); 上。请参阅我的级联代码。

标签: spring spring-boot jpa h2


【解决方案1】:

更新:需求变更

public interface ChargeRepo extends JpaRepository<Charge, Long> {
  List<Charge> findByTimeGreaterThan(LocalTime time);
}

ChargeScheme 类

package no.mycompany.myapp.misc;

import lombok.Data;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@Data
@Entity
public class ChargeScheme {

  @Id
  @GeneratedValue(strategy= GenerationType.IDENTITY)
  @Column(name="cs_id")
  private  Long id;

  @OneToMany(mappedBy="chargeScheme", cascade = {CascadeType.MERGE, CascadeType.PERSIST})
  private Set<Charge> charges = new HashSet<>();
}

收费等级

package no.mycompany.myapp.misc;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.time.LocalTime;

// cannot use @Data here because of circular ref
@Getter
@Setter
@Entity
public class Charge {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private LocalTime time;
    private double rate;
    @ManyToOne
    @JoinColumn(name = "cs_id", nullable = false)
    private ChargeScheme chargeScheme;
}

刚刚用这个 repo 完成了一个测试:

public interface ChargeSchemeRepo extends JpaRepository<ChargeScheme, Long> {
  List<ChargeScheme> findByChargesTimeGreaterThan(LocalTime time);
}

@James Wagstaff 的回答中的查询也在我的测试中工作,但我猜你正在寻找一个收集结果。

当使用它时,例如一个 RestController,你可以得到一个分页和排序的结果,如下所示:

public interface ChargeSchemeRepo extends JpaRepository<ChargeScheme, Long> {
  Page<ChargeScheme> findByChargesTimeGreaterThan(LocalTime time, Pageable pageable);
}

【讨论】:

  • 谢谢你!我尝试了这两个建议,但我得到了 null 返回。我在做一些明显错误的事情吗?我真的需要与收费方案相关的完整收费清单,而不是一系列方案。每个方案都有 24 个与之关联的电荷带
  • 用新的回购更新了我的答案。您不需要通过ChargeScheme,因为Charge 的所有实例都必须有一个父级(非空)。 BR
  • @Elbusta:我建议的查询返回一个列表,而不是可选的。 Optional&lt;ChargeScheme&gt; opt2 = chargeSchemeRepository.findByChargesTimeGreaterThan(time) 应该是 List&lt;ChargeScheme&gt; opt2 = chargeSchemeRepository.findByChargesTimeGreaterThan(time)
【解决方案2】:

您可以使用 jpaRepository 查询连接表并使用 _ 字符查询子表。

例如:

Optional<Charge> findAllByCharges_TimeGreaterThan(LocalTime time);

查看 JpaRepository 接口及其继承的所有接口,它是一个非常强大的工具。 Spring JpaRepository

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 2021-04-13
    相关资源
    最近更新 更多