【发布时间】: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 也会有所帮助。