【问题标题】:Hibernate sql query to criteria休眠 sql 查询到条件
【发布时间】:2015-05-28 11:50:52
【问题描述】:

我在将原始 sql 查询转换为条件时遇到问题。

我的原始查询如下所示:

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

Error_Signal(带有额外字段的多对多 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)

【问题讨论】:

  • 你有没有在你的班级中为id声明@Id?
  • yes SignalEntity.ID 用 Id 标记,ErrorSignalEntity.primaryKey 用 EmbeddedId 标记,因为它属于 ErrorSignalPK(复合 PK)类型
  • 至少向我们展示您的实体和生成的不起作用的 SQL。相应的 DDL 也会有所帮助。

标签: java hibernate criteria


【解决方案1】:

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

希望这会对遇到同样需求的人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2011-06-08
    • 2015-01-25
    相关资源
    最近更新 更多