我在数据库中有一个无法修改的表,并且有一个必须使用的值对列表,以便从该表中选择与列表中的两个值完全匹配的记录。
例如,我的配对列表由('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;
}
}
答案 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)