如何使用jpa-crud存储库查询联接表



例如,如何查询收费方案实体以根据时间返回费用?

这是我的两个实体类。

*编辑添加了我的测试代码,两个解决方案都为我返回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();
}

更新:需求更改

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

刚刚完成了此回购的测试:

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

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

例如:

Optional<Charge> findAllByCharges_TimeGreaterThan(LocalTime time);

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

最新更新