Java 使用hibernate中的EXISTS仅返回一行以获得性能(不带setMaxResult)

Java 使用hibernate中的EXISTS仅返回一行以获得性能(不带setMaxResult),java,sql,hibernate,jpa,Java,Sql,Hibernate,Jpa,若在非常大的表中存在任何ID相同但不是主键的重复行,则必须打印一条消息,该表符合where子句 Table Person表上没有索引 PersonPrimaryKEY PersonName ID Email Address InvoiceID TaxID 1 Bob 1 bob@example.com 1/Harton st 1 1

若在非常大的表中存在任何ID相同但不是主键的重复行,则必须打印一条消息,该表符合where子句

Table Person表上没有索引

PersonPrimaryKEY    PersonName      ID      Email             Address      InvoiceID  TaxID
       1             Bob             1       bob@example.com   1/Harton st   1        1
       2             John            2       john@example.com  2/Harton st   2        2
       3             Peter           1123    peter@example.com 3/Harton st   3        3
我用冬眠

public Collection<Person> readByNameAndID (String name, String ID)
{
    TypedQuery<Person> q = getEntityManager ().createNamedQuery("Select p FROM Person p WHERE Name =:Name AND ID <> :ID", Person.class);
    q.setParameter ("Name", Name);
    q.setParameter ("ID", ID);
    return q.getResultList ();
}
问题是,它在读取大表时效率很低

我怎样才能使它非常有效?我曾考虑使用EXISTS或COUNT来实现这一点,但如何将其与hibernate合并,使其只返回一行,然后我检查size>0,这将非常有效

或者setMaxResult是唯一的解决方案

谢谢


Aiden

由于您考虑的记录重复是基于具有相同的人名,因此以下HQL查询应该可以做到这一点:

SELECT COUNT(p)
FROM Person p
GROUP BY p.PersonName
HAVING COUNT(p) > 1

如果此查询的计数大于0,则表示存在重复项。

我们可以这样做吗?从存在的人中选择TOP 1*,从姓名='A'和ID'1'的人中选择*,非常感谢您提供的信息。有一件事,我们能让计数更有效吗?As COUNT*将解析所有表以获得总计数。是否有任何技术可以使用EXISTS等,因为我们只需检查重复,即使存在具有相同ID的单行,我们返回查询并给出错误,无需解析所有行。无法避免计算所有行。然而,使用COUNT1似乎是一种有效的方法,q.v.了解更多信息。我认为你完全正确。最后一件事,为什么我们不使用EXISTS来检查重复行是否存在?我听说EXISTS的速度要快得多,因为它不会解析整个表,而是在找到满足条件的第一行时返回?在这之后,我将这个问题标记为已回答:Person表中的列是什么?我检查了,结果是:谢谢!
SELECT COUNT(p)
FROM Person p
GROUP BY p.PersonName
HAVING COUNT(p) > 1