Java 如何使用Hibernate条件实现这个多重选择和where查询?
我遇到了Hibernate条件查询问题 表DataStatus数据如下所示:Java 如何使用Hibernate条件实现这个多重选择和where查询?,java,mysql,hibernate,hibernate-criteria,Java,Mysql,Hibernate,Hibernate Criteria,我遇到了Hibernate条件查询问题 表DataStatus数据如下所示: |-------------|--------------|--------------|---------------------| | name | info | server | starttime | |-------------|--------------|--------------|---------------------| | B
|-------------|--------------|--------------|---------------------|
| name | info | server | starttime |
|-------------|--------------|--------------|---------------------|
| Bob | information1 | www1 | 2018-02-14 10:32:43 |
| Alice | information2 | www3 | 2018-02-14 17:34:43 |
| Bob | information3 | www2 | 2018-02-14 10:32:43 |
| Alice | information4 | www1 | 2018-02-14 11:25:51 |
| Alice | information5 | www2 | 2018-02-14 08:42:25 |
| Bob | information6 | www3 | 2018-02-14 10:32:43 |
|-------------|--------------|--------------|---------------------|
Criteria criteria = session.CreateCriteria(DataStatus.class);
criteria.add(
Restrictions.and(
criteria.add(Restrictions.isNotNull("server")),
criteria.add(Restrictions.eq("name", "Bob")),
criteria.add(Restrictions.lt("starttime", ))
)
);
查询如下所示:
SELECT * FROM DataStatus sts
WHERE sts.server IS NOT NULL
AND sts.name = 'Bob'
AND sts.starttime < (
SELECT starttime FROM DataStatus
WHERE name = 'Alice' AND server = sts.server);
|-------------|--------------|--------------|---------------------|
| name | info | server | starttime |
|-------------|--------------|--------------|---------------------|
| Bob | information1 | www1 | 2018-02-14 10:32:43 |
| Bob | information6 | www3 | 2018-02-14 10:32:43 |
|-------------|--------------|--------------|---------------------|
我尝试过以下方法:
|-------------|--------------|--------------|---------------------|
| name | info | server | starttime |
|-------------|--------------|--------------|---------------------|
| Bob | information1 | www1 | 2018-02-14 10:32:43 |
| Alice | information2 | www3 | 2018-02-14 17:34:43 |
| Bob | information3 | www2 | 2018-02-14 10:32:43 |
| Alice | information4 | www1 | 2018-02-14 11:25:51 |
| Alice | information5 | www2 | 2018-02-14 08:42:25 |
| Bob | information6 | www3 | 2018-02-14 10:32:43 |
|-------------|--------------|--------------|---------------------|
Criteria criteria = session.CreateCriteria(DataStatus.class);
criteria.add(
Restrictions.and(
criteria.add(Restrictions.isNotNull("server")),
criteria.add(Restrictions.eq("name", "Bob")),
criteria.add(Restrictions.lt("starttime", ))
)
);
我不知道如何使用Hibernate条件实现这个嵌套的where和select查询
提前感谢。我不熟悉Hibernate,但您可以重写查询以避免子选择
SELECT bob.* /** Only include cols from Bob records */
FROM DataStatus bob
/** Only include rows with a later Alice record on the same server */
JOIN DataStatus alice
ON alice.name = 'Alice'
AND alice.server = bob.server
AND alice.starttime > bob.starttime
WHERE bob.name = 'Bob'
您可能会发现使用Hibernate语法时效果更好
注意:假设每个名称和服务器最多有一条记录。这可以通过名称、服务器上的唯一密钥强制执行
此假设基于以下条件:从原始查询中{bob server row starttime}