hibernate - 如何在 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。
解决方案
如果Stud_code
并且Div
是可嵌入对象的一部分,您可以像使用它一样使用它,select s from Student s where s.embeddable in :embeddables
并相应地传递一组可嵌入对象。不确定您具体指的是关于“Hibernate Criteria”(JPA Criteria API 或旧版 Hibernate Criteria API)的具体内容,但网上有很多关于如何使用这些 API 的教程。如果您仍然需要帮助,您还必须发布您正在使用的实体模型。
推荐阅读
- css - 粘性背景图像/w CSS
- sql-server - 沿 asp.net 核心部署 dacpac 的最佳实践
- html - 准确的 pandoc gfm 转换
- php - Conditional remove adjacent duplicates from array
- ckeditor - CKEditor:中心对齐不起作用
- python - 如何使用 Tensorflow 和 OpenCV 对经过训练的分类器进行流量计数?
- php - How to access Laravel symbolic link when uploaded to Heroku
- javascript - Having problems getting this multi level bootstrap 4 dropdown clone to mimc btn-dark style
- javascript - Is there a way to change your timezone in Chrome devtools?
- sql-server - Concatenation of textbox values to build SQL query