Criteria API仅与id连接到另一个表

时间:2018-02-14 10:14:00

标签: java hibernate hibernate-criteria criteria-api

我正在尝试使用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。

3 个答案:

答案 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“联接”,但是您可以组合DetachedCriteriaProjection来创建外部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));