我正在尝试使用Criteria API从一个表连接到另一个表。问题是表合同只有 salesId 定义为long(所以没有FK)。然后我不确定如何将合同与销售联系起来。最好在下面举例说明。
架构如下:
Table Contract:
----------------------
ID | salesId |
----------------------
1 | 1 |
2 | 2 |
----------------------
Table Sales:
----------------------
ID | code |
----------------------
1 | SALES_1 |
2 | SALES_2 |
----------------------
在合约实体中,我只有私人Long salesId;
我需要达到的目标是:
getSession().createCriteria(Contract.class)
.createAlias("salesId", "s") // somehow connect to Sales table
.add(Restrictions.eq("s.code", salesCode)); // salesCode is param
所以我不能直接使用createAlias↓,因为它不知道hibernate
.createAlias("sales", "s")
我无法更改模型以在表之间创建FK。有办法解决这个问题吗?我想避免使用sql字符串连接。
编辑:我使用Criteria API的原因是其他查询参数(此处未显示)是可选的,然后它们不能成为SQL查询的一部分。这就是为什么我不能使用HQL。
答案 0 :(得分:1)
为什么不想使用HQL并编写这样的查询:
select * from Contact t1 join Sales t2 where t1.salesId=t2.ID
答案 1 :(得分:1)
这可能是你在hibernate 5中的解决方案:
Criteria criteria = getSession().createCriteria(Contract.class);
Criterion subquery = Restrictions.sqlRestriction("{alias}.salesId = (select id from TABLE_SALES where code = ?)", salesCode, StandardBasicTypes.STRING);
criteria.add(subquery);
您希望将其用于动态查询,然后根据您的业务逻辑,您可以在自定义限制条件上使用该条件。
criteria.add(Restrictions.and(subquery)) -- example
criteria.add(Restrictions.or(subquery)) -- example
PD:TABLE_SALES必须是数据库中的Sales表名,您也可以预先附加其架构。
干杯。
答案 2 :(得分:0)
这不是SQL“联接”,但是您可以组合DetachedCriteria和Projection来创建外部SQL“ in”(或“ not in”):
criteria.add(Restrictions.eq("table1ColumnName", XXX));
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(OtherMappedClass.class);
detachedCriteria.setProjection(Property.forName("sameColumnName"));
detachedCriteria.add(Restrictions.eq("table2ColumnName", XXX)););
criteria.add(Property.forName("sameColumnName").in(detachedCriteria));