Как построить JPA Query из списков сгруппированных значений - PullRequest
0 голосов
/ 10 апреля 2019

Справочная информация:

У меня есть модель данных и репозиторий 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...