休眠HQL:选择同时匹配两个值的记录

时间:2018-11-13 08:36:40

标签: hibernate hql

我在数据库中有一个无法修改的表,并且有一个必须使用的值对列表,以便从该表中选择与列表中的两个值完全匹配的记录。

例如,我的配对列表由('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 :(得分:1)

考虑问题中的评论,我尝试恢复可能的解决方案。

关注

在这些解决方案中,由于我不知道您的对象,所以我将用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相同(创建一个单独的表),但是可以使用EXISTS子句代替JOIN,如下所示:

SELECT *
FROM yourtable yt
WHERE EXISTS
    (SELECT 'OK'
    FROM okcouples oc
    WHERE oc.col1 = yt.column1
    AND oc.col2 = yt.column2)