如何使用 jpa crud 存储库查询 join table

How to query join table with jpa crud repository

我如何查询收费方案实体以 return 收费,例如按时间收费?

这是我的两个实体 类。

*编辑 添加了我的测试代码,两种解决方案 return 对我来说都是空的,我做错了什么吗?不过我觉得我越来越近了!

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

您可以使用 jpaRepository 查询加入 tables 并使用 _ 字符查询子 table。

例如:

Optional<Charge> findAllByCharges_TimeGreaterThan(LocalTime time);

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

更新:要求变更

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

收费方案class

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<>();
}

充电class

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