Java 删除在hibernate中不工作的内容
我正在使用mysql。以下查询在mysql浏览器中工作,但当我在hibernate中使用此查询时,它会在内部选择附近出现异常,如:Java 删除在hibernate中不工作的内容,java,mysql,hibernate,Java,Mysql,Hibernate,我正在使用mysql。以下查询在mysql浏览器中工作,但当我在hibernate中使用此查询时,它会在内部选择附近出现异常,如: unexpected token: ( near line 1, column 104 这是第二个select子句的错误 查询是: delete from table where columnA in ( select columnA from ( select columnA from table group by
unexpected token: ( near line 1, column 104
这是第二个select子句的错误
查询是:
delete from table
where columnA in (
select columnA
from (
select columnA
from table
group by columnA
having count(*) > 1
) t
)
有人知道为什么会这样以及如何解决吗?你的别名't'从未被使用过。试试这个:) 如果您正在处理Hibernate,请尝试使用Hibernate查询语言(HQL)。例如,我们使用HQL以更灵活的方式删除实体,例如删除价格高于指定数量的产品
Query query = session.createQuery("delete Product where price > :maxPrice");
query.setParameter("maxPrice", new Float(1000f));
int result = query.executeUpdate();
if (result > 0) {
System.out.println("Expensive products was removed");
}
您还可以使用类HibernateTemplate中的方法execute(HibernateCallback操作)。它可能是这样的:
final Criterion criteria;
HibernateTemplate template;
template.execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException, SQLException {
List toDelete = session.createCriteria(Student.class).add(criteria).list();
for (Object o: toDelete){
session.delete(o);
}
}
});
IMHO此解决方案不是很有效,因为您必须在删除所有条目之前读取它们。更重要的是,您必须逐个删除每个条目,这是非常无效的。您的别名't'从未使用过。试试这个:) 如果您正在处理Hibernate,请尝试使用Hibernate查询语言(HQL)。例如,我们使用HQL以更灵活的方式删除实体,例如删除价格高于指定数量的产品
Query query = session.createQuery("delete Product where price > :maxPrice");
query.setParameter("maxPrice", new Float(1000f));
int result = query.executeUpdate();
if (result > 0) {
System.out.println("Expensive products was removed");
}
您还可以使用类HibernateTemplate中的方法execute(HibernateCallback操作)。它可能是这样的:
final Criterion criteria;
HibernateTemplate template;
template.execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException, SQLException {
List toDelete = session.createCriteria(Student.class).add(criteria).list();
for (Object o: toDelete){
session.delete(o);
}
}
});
IMHO此解决方案不是很有效,因为您必须在删除所有条目之前读取它们。更重要的是,您必须逐个删除每个条目,这是非常无效的。这个孤立的“t”在做什么?@Vihar子查询别名但未使用,所以orphan@Vihar有些数据库即使未使用也需要别名,尽管我不确定mysqloh是否正确,我明白了。。谢谢这个孤儿“t”在做什么?@Vihar子查询别名但未使用,所以orphan@Vihar有些数据库即使未使用也需要别名,尽管我不确定mysqloh是否正确,我明白了。。thanksit给出如下错误:“您不能在FROM子句中指定更新的目标表”为什么在Hibernate中使用本机SQL。改用Hibernates功能:)我正在使用hql查询。我已经在hql中转换了它,但在hql中它不起作用。你能为这个案例分享你的DAO吗?很抱歉,由于一些隐私,不能这样做。如果您想知道columnA的数据类型,那么它就是string。它给出如下错误:“您不能在FROM子句中指定更新的目标表”为什么在Hibernate中使用本机SQL。改用Hibernates功能:)我正在使用hql查询。我已经在hql中转换了它,但在hql中它不起作用。你能为这个案例分享你的DAO吗?很抱歉,由于一些隐私,不能这样做。如果您想知道columnA的数据类型,那么它就是string。