Java 如何在hibernate中按条件删除?
我有一个学生表,希望删除一个类中的所有学生 因此,我的sql查询如下所示:Java 如何在hibernate中按条件删除?,java,hibernate,Java,Hibernate,我有一个学生表,希望删除一个类中的所有学生 因此,我的sql查询如下所示: delete from student where classId = 333 如何使用带条件的hibernate实现这一点 我需要它,这样我就可以把我的一个基类放进去,供任何从它扩展的DAO对象使用。因此,我可以在我的所有DAO对象中使其通用 目前,我已经创建了一个通用方法,该方法将在Student对象中使用-调用使用条件获取列表的find方法,然后我在一个事务下执行批量删除,如下所示: public boolean
delete from student where classId = 333
如何使用带条件的hibernate实现这一点
我需要它,这样我就可以把我的一个基类放进去,供任何从它扩展的DAO对象使用。因此,我可以在我的所有DAO对象中使其通用
目前,我已经创建了一个通用方法,该方法将在Student对象中使用-调用使用条件获取列表的find方法,然后我在一个事务下执行批量删除,如下所示:
public boolean deleteByCriteria(Object deleteObject) {
List deleteObjectList = find(deleteObject);
if (deleteObjectList == null)
return false;
return deleteAll(deleteObjectList);
}
public boolean deleteAll(List deleteObjectList) {
if (logger.isDebugEnabled()) {
logger.debug("Entered BaseSchoolRollBookDAO -> delete");
logger.debug("Object for batch deletion [" + deleteObjectList + "]");
}
boolean result = false;
Transaction tx = null;
// Get CurrentSession from HibernateUtils
Session session = HibernateUtils.getSession();
// Start transaction
tx = session.beginTransaction();
// Create new Criteria to be passed
try {
int flushCount = 0;
for (Object deleteObject : deleteObjectList) {
session.delete(deleteObject);
flushCount++;
if (flushCount % 20 == 0) {
session.flush();
session.clear();
}
}
tx.commit();
result = true;
} catch (HibernateException e) {
logger.fatal("Exception in executing batch Delete query", e);
if (tx != null && tx.isActive())
tx.rollback();
}
return result;
}
对于删除使用HQL,HQL是最好的选择,我认为,标准的主要目的是只检索数据。
这一个符合
标准
Student student = (Student ) session.createCriteria(Student.class)
.add(Restrictions.eq("classId", classId)).uniqueResult();
session.delete(student);
这是一个简单的HQL查询:
String hql = "delete from Student where classId= :classId";
session.createQuery(hql).setString("classId", classId).executeUpdate();
您可以通过如下简单的hibernate轻松实现:
Session session=getSession();
String hql = "delete from Student where classId= :id";
session.createQuery(hql).setLong("id", new Integer(id)).executeUpdate();
有关详细信息/**
*
*@param对象
*/
公共静态void deleteAll(列出对象){
试一试{
HibernateEntityManager em=JPA.em().unwrap(HibernateEntityManager.class);
Session Session=em.getSession();
用于(对象o:对象){
删除(o);
}
}捕获(例外e){
Logger.error(“CommonHibernateBD_deleteAll error:+e”);
e、 printStackTrace();
}
}
首先,您需要一个带有输入的表单,输入的值是您在modelmap中建模的模型,而不是
制作
删除
在某些链接中。
然后使用
@requestparam(“id”)字符串id
我知道我们有这个物体的id
然后删除id
e、 g
这是最好的方法,比@Jama asatilayev的答案更好。 因为您不必首先检索持久对象
Product product = new Product();
product.setId(37);
session.delete(product);
然后hibernate将运行:
Hibernate: delete from PRODUCT where PRODUCT_ID=?
更多详细信息:您应该将hibernate版本升级到实现JPA2.1的版本(hibernate在版本4.3.11.Final上启动JPA2.1) 升级后,可以使用CriteriaDelete执行所需操作。 下面是一个小例子:
您可以使用条件中的条件
public Integer deleteByFieldIn(String Field, Iterable<?> values) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaDelete<T> delete = cb.createCriteriaDelete(getDomainClass());
Root<T> e = delete.from(getDomainClass());
delete.where(cb.in(e.get(Field)).value(values));
return entityManager.createQuery(delete).executeUpdate();
}
public Integer deleteByFieldIn(字符串字段,Iterable值){
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaDelete=cb.createCriteriaDelete(getDomainClass());
Root e=delete.from(getDomainClass());
删除.其中(cb.in(e.get(Field)).value(values));
返回entityManager.createQuery(delete.executeUpdate();
}
您可以通过将“in”替换为“equal like”来对“equal”条件使用相同的值
public Integer deleteById(String id) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaDelete<T> delete = cb.createCriteriaDelete(getDomainClass());
Root<T> e = delete.from(getDomainClass());
delete.where(cb.equal(e.get("id"), id));
return entityManager.createQuery(delete).executeUpdate();
}
public整数deleteById(字符串id){
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaDelete=cb.createCriteriaDelete(getDomainClass());
Root e=delete.from(getDomainClass());
删除。其中(cb.equal(e.get(“id”),id));
返回entityManager.createQuery(delete.executeUpdate();
}
我知道我参加聚会已经很晚了,但是如果你碰巧使用JPA2.1,你可以这样做-
公共订单(双倍金额){
CriteriaBuilder cb=this.em.getCriteriaBuilder();
//创建删除
CriteriaDelete=cb。
createCriteriaDelete(Order.class);
//设置根类
根e=delete.from(Order.class);
//设置where子句
删除。其中(cb.lessThanOrEqualTo(e.get(“金额”),amount));
//执行更新
this.em.createQuery(delete.executeUpdate();
}
要删除,必须使用标准删除
查询<代码>CriteriaBuilder确保如果正确使用此选项,查询是类型安全的。向方法中添加元数据类Student
,以避免HQL
、JPQL
或NativeQuery
特有的错误
...
private EntityManager em;
...
public void deleteByIdUser(int classId) {
try {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaDelete<Student> deleteQuery = builder.createCriteriaDelete(Student.class);
Root<Student> studentTable = deleteQuery.from(Student.class);
Path<Long> classIdPath = userRoleTable.get(Student_.classId);
Predicate classIdPredicate = builder.equal(classIdPath, classId);
deleteQuery.where(classIdPredicate);
em.createQuery(deleteQuery).executeUpdate();
} catch (Exception e) {
...
}
}
。。。
私人实体管理者;
...
公共void deleteByIdUser(int classId){
试一试{
CriteriaBuilder=em.getCriteriaBuilder();
CriteriaDeleteQuery=builder.createCriteriaDelete(Student.class);
Root studentTable=deleteQuery.from(Student.class);
Path classIdPath=userRoleTable.get(Student\ux.classId);
谓词classIdPredicate=builder.equal(classIdPath,classId);
deleteQuery.where(classIdPredicate);
em.createQuery(deleteQuery).executeUpdate();
}捕获(例外e){
...
}
}
必须将此信息添加到pom中,才能为实体生成元数据类
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
org.apache.maven.plugins
maven编译器插件
org.hibernate
冬眠
这是冗长的,但避免了冗余的
运行时异常
只是给其他人的一个提示。如果使用Jamshid建议的Hibernate版本,则仍然必须存储事务:tx=session.beginTransaction();然后执行提交:tx.commit();为了让它工作,这个标准真的有效吗?看起来很奇怪,让学生成为uniqueResult然后删除它。我已经离开了Hibernate,很抱歉在很长一段时间后发表了这个评论,但我认为上面的Hibernate标准示例不起作用,因为这是我问这个问题的主要原因,也是为什么我必须在示例中这样做的原因。这不是一个特别好的方法在解决方案中,您需要转到数据库检索结果,然后发送后续的删除指令。如果必须删除1M行怎么办?你真的不想把它们都放到内存中,只想把查询重新发送回数据库。@Michael,你说得对。。。我提到的标准是用于检索的,我只是回答了如何实现这一点,即使使用标准,同时说HQL是最好的选择……我想知道,在循环中删除是否会导致性能问题?好吧,它没有直接回答“我如何使用
public void deleteOrder(Double amount) {
CriteriaBuilder cb = this.em.getCriteriaBuilder();
// create delete
CriteriaDelete<Order> delete = cb.
createCriteriaDelete(Order.class);
// set the root class
Root e = delete.from(Order.class);
// set where clause
delete.where(cb.lessThanOrEqualTo(e.get("amount"), amount));
// perform update
this.em.createQuery(delete).executeUpdate();
}
...
private EntityManager em;
...
public void deleteByIdUser(int classId) {
try {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaDelete<Student> deleteQuery = builder.createCriteriaDelete(Student.class);
Root<Student> studentTable = deleteQuery.from(Student.class);
Path<Long> classIdPath = userRoleTable.get(Student_.classId);
Predicate classIdPredicate = builder.equal(classIdPath, classId);
deleteQuery.where(classIdPredicate);
em.createQuery(deleteQuery).executeUpdate();
} catch (Exception e) {
...
}
}
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>