如何在 WHERE IN 子句中使用组合键
How to use composite key in WHERE IN clause
Table结构:
CREATE TABLE `Student` (
`RollNumber` bigint(20) NOT NULL AUTO_INCREMENT,
`Standard` bigint(20) NOT NULL,
`Div_db` varchar(100) DEFAULT NULL,
`Stud_code` varchar(100) DEFAULT NULL,
`Name_DB` varchar(100) DEFAULT NULL,
`DateOfBirth` datetime DEFAULT NULL,
PRIMARY KEY (`RollNumber`),
UNIQUE KEY `UK_Student` (`Stud_code`,`Div_db`)
)
出于性能原因,我必须使用 WHERE IN 子句中的复合键从此 table 进行查询。
例如
SELECT * FROM Student WHERE ( Stud_code, Div ) IN (( 'C1', 'D1' ), ( 'C2', 'D2' ).....( 'Cn', 'Dn' ));
如何使用休眠条件来做到这一点?
编辑:
我正在使用动态模型
实体 HBM :
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class entity-name="Student" table="Student" dynamic-insert="true" mutable="true" polymorphism="implicit" dynamic-update="true" select-before-update="false" optimistic-lock="version" batch-size="1">
<meta attribute="class-description">
This class mapping info of Student
</meta>
<id name="RollNumber" type="int" column="RollNumber">
<generator class="native"/>
</id>
<version name="Standard" access="field" column="Standard" type="int" unsaved-value="undefined" generated="never"/>
<property name="Name" type="java.lang.String" column="Name_DB" unique="false" optimistic-lock="true" lazy="false" generated="never"/>
<property name="DateOfBirth" type="java.util.Date" column="DateOfBirth" unique="false" optimistic-lock="true" lazy="false" generated="never"/>
<properties name="UK_Student" unique="true" insert="true" update="true" optimistic-lock="true">
<property name="Stud_code" type="java.lang.String" column="Stud_code" unique="false" optimistic-lock="true" lazy="false" generated="never"/>
<property name="Div" type="java.lang.String" column="Div_db" unique="false" optimistic-lock="true" lazy="false" generated="never"/>
</properties>
</class>
使用 Hibernate 条件从实体读取记录:
Criteria fetchCriteria = session.createCriteria("Student");
fetchCriteria.setMaxResults(10000);
Disjunction disjunction = Restrictions.disjunction();
for (int i = 1; i <= 10000; i++) {
Conjunction conjunction = Restrictions.conjunction();
conjunction.add(Restrictions.eq("Stud_code", String.valueOf(i)));
conjunction.add(Restrictions.eq("Div", "A"));
disjunction.add(conjunction);
}
fetchCriteria.add(disjunction);
List resultList = fetchCriteria.setFirstResult(0).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).list();
查询哪个hibernate内部创建:
Hibernate: select this_.RollNumber as RollNumb1_0_0_, this_.Standard as Standard2_0_0_, this_.Name_DB as Name_DB3_0_0_, this_.DateOfBirth as DateOfBi4_0_0_, this_.Stud_code as Stud_cod5_0_0_, this_.Div_db as Div_db6_0_0_ from Student this_ where ((this_.Stud_code=? and this_.Div_db=?) or (this_.Stud_code=? and this_.Div_db=?) or .....
但由于某些性能原因,我想使用 Hibernate 条件生成我之前提到的查询。
注意:我使用的是hibernate 4.3.8。
如果 Stud_code
和 Div
是可嵌入对象的一部分,您可以像 select s from Student s where s.embeddable in :embeddables
一样使用它并相应地传递一组可嵌入对象。不确定您具体指的是什么关于“Hibernate Criteria”(JPA Criteria API 或旧版 Hibernate Criteria API),但是网上有很多关于如何使用这些 API 的教程.如果您仍然需要帮助,您还必须 post 您正在使用的实体模型。
Table结构:
CREATE TABLE `Student` (
`RollNumber` bigint(20) NOT NULL AUTO_INCREMENT,
`Standard` bigint(20) NOT NULL,
`Div_db` varchar(100) DEFAULT NULL,
`Stud_code` varchar(100) DEFAULT NULL,
`Name_DB` varchar(100) DEFAULT NULL,
`DateOfBirth` datetime DEFAULT NULL,
PRIMARY KEY (`RollNumber`),
UNIQUE KEY `UK_Student` (`Stud_code`,`Div_db`)
)
出于性能原因,我必须使用 WHERE IN 子句中的复合键从此 table 进行查询。 例如
SELECT * FROM Student WHERE ( Stud_code, Div ) IN (( 'C1', 'D1' ), ( 'C2', 'D2' ).....( 'Cn', 'Dn' ));
如何使用休眠条件来做到这一点?
编辑:
我正在使用动态模型
实体 HBM :
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class entity-name="Student" table="Student" dynamic-insert="true" mutable="true" polymorphism="implicit" dynamic-update="true" select-before-update="false" optimistic-lock="version" batch-size="1">
<meta attribute="class-description">
This class mapping info of Student
</meta>
<id name="RollNumber" type="int" column="RollNumber">
<generator class="native"/>
</id>
<version name="Standard" access="field" column="Standard" type="int" unsaved-value="undefined" generated="never"/>
<property name="Name" type="java.lang.String" column="Name_DB" unique="false" optimistic-lock="true" lazy="false" generated="never"/>
<property name="DateOfBirth" type="java.util.Date" column="DateOfBirth" unique="false" optimistic-lock="true" lazy="false" generated="never"/>
<properties name="UK_Student" unique="true" insert="true" update="true" optimistic-lock="true">
<property name="Stud_code" type="java.lang.String" column="Stud_code" unique="false" optimistic-lock="true" lazy="false" generated="never"/>
<property name="Div" type="java.lang.String" column="Div_db" unique="false" optimistic-lock="true" lazy="false" generated="never"/>
</properties>
</class>
使用 Hibernate 条件从实体读取记录:
Criteria fetchCriteria = session.createCriteria("Student");
fetchCriteria.setMaxResults(10000);
Disjunction disjunction = Restrictions.disjunction();
for (int i = 1; i <= 10000; i++) {
Conjunction conjunction = Restrictions.conjunction();
conjunction.add(Restrictions.eq("Stud_code", String.valueOf(i)));
conjunction.add(Restrictions.eq("Div", "A"));
disjunction.add(conjunction);
}
fetchCriteria.add(disjunction);
List resultList = fetchCriteria.setFirstResult(0).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).list();
查询哪个hibernate内部创建:
Hibernate: select this_.RollNumber as RollNumb1_0_0_, this_.Standard as Standard2_0_0_, this_.Name_DB as Name_DB3_0_0_, this_.DateOfBirth as DateOfBi4_0_0_, this_.Stud_code as Stud_cod5_0_0_, this_.Div_db as Div_db6_0_0_ from Student this_ where ((this_.Stud_code=? and this_.Div_db=?) or (this_.Stud_code=? and this_.Div_db=?) or .....
但由于某些性能原因,我想使用 Hibernate 条件生成我之前提到的查询。
注意:我使用的是hibernate 4.3.8。
如果 Stud_code
和 Div
是可嵌入对象的一部分,您可以像 select s from Student s where s.embeddable in :embeddables
一样使用它并相应地传递一组可嵌入对象。不确定您具体指的是什么关于“Hibernate Criteria”(JPA Criteria API 或旧版 Hibernate Criteria API),但是网上有很多关于如何使用这些 API 的教程.如果您仍然需要帮助,您还必须 post 您正在使用的实体模型。