如何使用 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);
}
我如何查询收费方案实体以 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);
}