Справочная информация:
У меня есть модель данных и репозиторий jpa, которые извлекают строки из таблицы соответствия ключей. В одной из присоединяемых таблиц поля (int) monr
и (short) mitm
используются в качестве первичного ключа комбинированного списка, а в другой - (String) htnr
, (char) mold
, (short) csnr
в качестве первичного ключа комбинированного списка.
Таблица, в которой я работаю, объединяет эти значения в пары, поэтому между ними существует отношение многие ко многим (комбинация monr-mitm
может иметь много совпадений htnr-mold-csnr
и наоборот). Я использую встроенную rowid
таблицы совпадений в качестве @Id
в моей модели jpa.
Мой текущий код ниже работает , но мне нужно расширить его, чтобы выбрать из этой таблицы, используя парные списки комбинаций monr-mitm
или htnr-mold-csnr
.
Для monr-mitm
списки вида:
monrs = [<x1>, <x2> ... <xn>]
mitms = [<y1>, <y2> ... <yn>]
желаемый запрос будет выглядеть так:
select *
from cs_mi_match
where (monr = <x1> and mitm = <y1>)
or (monr = <x2> and mitm = <y2>)
.
.
.
or (monr = <xn> and mitm = <yn>)
и htnr-mold-csnr
списки формы:
htnrs = [<x1>, <x2> ... <xn>]
molds = [<y1>, <y2> ... <yn>]
csnrs = [<z1>, <z2> ... <zn>]
желаемый запрос будет выглядеть так:
select *
from cs_mi_match
where (htnr = <x1> and mold = <y1> and csnr = <z1>)
or (htnr = <x2> and mold = <y2> and csnr = <z2>)
.
.
.
or (htnr = <xn> and mold = <yn> and csnr = <zn>)
Вопрос:
Каким будет синтаксис JPA / Spring, чтобы взять несколько списков и объединить их в единый запрос, который группирует значения, как показано выше?
Пример кода:
Текущий контроллер выглядит так:
@RestController
public class provAsgnBackendController {
private final Cs_mi_matchRepo matchTableRepo;
@Autowired
provAsgnBackendController(Cs_mi_matchRepo matchTableRepo) {
this.matchTableRepo = matchTableRepo;
}
@RequestMapping(value = "/api/getOrderSlabs", method = RequestMethod.GET)
@ResponseBody
public ArrayList<Cs_mi_match> getOrderSlabs(@RequestParam String monrs) throws Exception {
ArrayList<Cs_mi_match> matchResults = new ArrayList<Cs_mi_match>();
List<Integer> monrList = new ArrayList<Integer>();
for (String m : monrs.split(","))
monrList.add(Integer.parseInt(m));
try {
matchResults = new ArrayList<Cs_mi_match>(matchTableRepo.slabsForOrders(Arrays.asList(monrs.split(","))));
} catch (Exception ex) {
ex.printStackTrace();
}
return matchResults;
}
}
Текущий репо выглядит так:
@Repository
public interface Cs_mi_matchRepo extends JpaRepository<Cs_mi_match, Integer>{
@Query(value = "SELECT rowid, * FROM cs_mi_match WHERE monr in (:monrs) ORDER BY htnr, mold, csnr", nativeQuery = true)
public List<Cs_mi_match> slabsForOrders(@Param("monrs") List<String> monrs);
}
Текущая модель выглядит так:
@Entity
public class Cs_mi_match implements Serializable {
private static final long serialVersionUID = 1L;
private Integer rowid;
private String htnr;
private Character mold;
private Short csnr;
private Integer monr;
private Short mitm;
public Cs_mi_match() {}
public Cs_mi_match(Integer rowid, String htnr, Character mold, Short csnr, Integer monr, Short mitm) {
this.rowid = rowid;
this.htnr = htnr;
this.mold = mold;
this.csnr = csnr;
this.monr = monr;
this.mitm = mitm;
}
@Id
@Column(name = "rowid")
public Integer getRowid() {
return this.rowid;
}
public void setRowid(Integer rowid) {
this.rowid = rowid;
}
@Column(name = "htnr")
public String getHtnr() {
return htnr;
}
public void setHtnr(String htnr) {
this.htnr = htnr;
}
// SETTERS & GETTERS CONTINUE AS ABOVE
}