首页 > 解决方案 > 如何在 WHERE IN 子句中使用复合键

问题描述

表结构:

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 子句中的复合键从该表中进行查询。例如

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 标准生成我之前提到的查询。

注意:我使用的是休眠 4.3.8。

标签: hibernatehibernate-criteria

解决方案


如果Stud_code并且Div是可嵌入对象的一部分,您可以像使用它一样使用它,select s from Student s where s.embeddable in :embeddables并相应地传递一组可嵌入对象。不确定您具体指的是关于“Hibernate Criteria”(JPA Criteria API 或旧版 Hibernate Criteria API)的具体内容,但网上有很多关于如何使用这些 API 的教程。如果您仍然需要帮助,您还必须发布您正在使用的实体模型。


推荐阅读