Hibernate HQL: выберите записи, которые соответствуют двум значениям одновременно - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть таблица в БД, которую я не могу изменить, и у меня есть список пар значений, которые я должен использовать для выбора записей из этой таблицы, которые точно соответствуют обоим значениям в списке.

Например, мой список пар состоит из ('A1', 'A2'), ('B1', 'B2'), ('C1', 'C2'), а моя таблица состоит из следующих данных

--------------------------
| ID | COLUMN1 | COLUMN2 |
--------------------------
| 1  | 'A1'    | 'A2'    |
| 2  | 'B1'    | 'B2'    |
| 3  | 'A1'    | 'B2'    |
| 4  | 'B1'    | 'A2'    |
| 5  | 'C1'    | 'C2'    |
--------------------------

Правильный набор результатов должен быть

1, 'A1', 'A2'
2, 'B1', 'B2'
5, 'C1', 'C2'

, что означает, что в нем не должно быть таких записей, как

3, 'A1', 'B2'
4, 'B1', 'A2'

.

Как мне добиться такого результата с помощью HQL?Производительность является препятствием в моей ситуации, поэтому решение, реализованное посредством объединения значений, для меня нецелесообразно.

РЕДАКТИРОВАТЬ:

, если это может помочь,Java-сущность очень проста и выглядит так:

package org.example;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;

@Entity
@Table(name = "MY_TABLE")
public class ExampleEntity implements Serializable {
    @Id
    @Column(name = "ID", unique = true)
    private int id;

    @Column(name = "COLUMN1")
    private String column1;

    @Column(name = "COLUMN2")
    private String column2;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getColumn1() {
        return column1;
    }

    public void setColumn1(String column1) {
        this.column1 = column1;
    }

    public String getColumn2() {
        return column2;
    }

    public void setColumn2(String column2) {
        this.column2 = column2;
    }
}

1 Ответ

0 голосов
/ 13 ноября 2018

Я пытаюсь возобновить возможные решения, учитывая комментарии в вопросе.

Обратите внимание

В этих решениях я напишу на SQL, потому что я нене знаю ваших объектов, но этот запрос можно переписать на HQL, если вы напишите свои объектные структуры

Решение 1

Рассмотрите ТОЛЬКО набор входных данных

SELECT *
FROM yourtable
WHERE column1 = 'A1' AND column2 = 'A2'
OR column1 = 'B1' AND column2 = 'B2'
OR column1 = 'C1' AND column2 = 'C2'

Решение 2

Если вы можете создать отдельную таблицу с хорошей парой, выполните следующие действия:

CREATE TABLE okcouples (col1 varchar(10), col2 varchar(10))

SELECT yt.*
FROM yourtable yt
JOIN okcouples oc
    ON yt.column1 = oc.col1
    AND yt.column2 = oc.col2

Решение 3

Это тот же сценарий решения 2 (создайте отдельную таблицу), но вместо JOIN вы можете использовать предложение EXISTS следующим образом:

SELECT *
FROM yourtable yt
WHERE EXISTS
    (SELECT 'OK'
    FROM okcouples oc
    WHERE oc.col1 = yt.column1
    AND oc.col2 = yt.column2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...