首页 文章

Hibernate sql查询条件

提问于
浏览
0

我有问题将原始SQL查询转换为条件 .

我的原始查询如下所示:

select id,signalid,signalname from signals where 
(select count(*) from error_signal where signalid_gen=id) == 0;

Error_Signal(带有额外字段的ManyToMany 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尝试过它 .

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_ERROR] SQL错误或缺少数据库(没有这样的列:signalenti1_.id)

1 回答

  • 0

    即使这是一个老问题,但我遇到了同样的要求 . 我最终使用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);
    

    希望这会帮助那些遇到同样需求的人 .

相关问题