Java Hibernate sql查询到条件
我无法将原始sql查询转换为条件 我的原始查询如下所示:Java Hibernate sql查询到条件,java,hibernate,criteria,Java,Hibernate,Criteria,我无法将原始sql查询转换为条件 我的原始查询如下所示: select id,signalid,signalname from signals where (select count(*) from error_signal where signalid_gen=id) == 0; Error_信号(带有额外字段的manytomy JoinTable)有一个复合PK,其中错误通过primaryKey.Error映射,信号通过primaryKey.Signal映射 这是我获取所有信号的标准 P
select id,signalid,signalname from signals where
(select count(*) from error_signal where signalid_gen=id) == 0;
Error_信号(带有额外字段的manytomy JoinTable)有一个复合PK,其中错误通过primaryKey.Error映射,信号通过primaryKey.Signal映射
这是我获取所有信号的标准
ProjectionList pList = Projections.projectionList();
pList.add(Projections.property(SignalEntity.ID).as(SignalEntity.ID));
pList.add(Projections.property(SignalEntity.SIGNAL_ID).as(SignalEntity.SIGNAL_ID));
pList.add(Projections.property(SignalEntity.SIGNALNAME).as(SignalEntity.SIGNALNAME));
Session session = DatabaseManager.getCurrentSession();
Criteria criteria = session.createCriteria(SignalEntity.class, "signal");
criteria.add(Restrictions.like(SignalEntity.SIGNALNAME, tmpSearch));
criteria.setProjection(pList);
现在我需要应用这个限制。
我试过了,但运气不好
DetachedCriteria countSubquery = DetachedCriteria.forClass(ErrorSignalEntity.class);
countSubquery.createCriteria(ErrorSignalEntity.SIGNAL_PK).add(Restrictions.eqProperty(SignalEntity.ID, "signal." + SignalEntity.ID));
countSubquery.setProjection(Projections.rowCount());
criteria.add(Subqueries.eq(new Integer(0), countSubquery));
我得到的错误是
原因:java.sql.SQLException:[SQLITE\u ERROR]sql错误或丢失
数据库(没有这样的列:signalenti1.id)
即使这是一个老问题,但我遇到了同样的要求。最后,我使用了Restrictions.sqlRestriction()函数
ProjectionList pList = Projections.projectionList();
pList.add(Projections.property(SignalEntity.ID).as(SignalEntity.ID));
pList.add(Projections.property(SignalEntity.SIGNAL_ID).as(SignalEntity.SIGNAL_ID));
pList.add(Projections.property(SignalEntity.SIGNALNAME).as(SignalEntity.SIGNALNAME));
Session session = DatabaseManager.getCurrentSession();
Criteria criteria = session.createCriteria(SignalEntity.class, "signal");
criteria.add(Restrictions.like(SignalEntity.SIGNALNAME, tmpSearch));
// *** Solution: add the special count check here ****
criteria.add(Restrictions.sqlRestriction("(select count(*) from error_signal where signalid_gen={alias}.id) == 0"));
criteria.setProjection(pList);
希望这将有助于遇到同样需求的人。您在类中为Id声明了@Id吗?是的,SignalEntity.Id用Id标记,ErrorSignalEntity.primaryKey用EmbeddedId标记,因为它属于ErrorSignalPK(复合PK)类型,至少向我们显示您的实体和生成的SQL不起作用。相应的DDL也会有所帮助。