java - 在 hibernate 中使用 EXISTS 仅返回一行以提高性能(不使用 setMaxResult)

标签 java sql hibernate jpa

如果表(非常大的表)中存在任何具有相同 ID(不是主键)的重复行,并且满足 where 子句,我必须打印一条消息。

表人是(表上没有索引)

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

我使用 hibernate

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 ();
}

使用的代码是

if(results.size > 0)
{
   System.out.println("Error exists");
}

问题是,读取大表时效率非常低。

如何才能使其非常高效?我正在考虑使用 EXISTS 或 COUNT 来做到这一点,但如何将它与 hibernate 合并,以便它只返回一行,然后我检查大小 > 0,这将是有效的。

或者 setMaxResult 是唯一的解决方案吗?

谢谢

艾登

最佳答案

由于您正在考虑基于具有相同 PersonName 的记录重复,因此以下 HQL 查询应该可以解决问题:

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

如果此查询的计数大于 0,则意味着存在重复项。

关于java - 在 hibernate 中使用 EXISTS 仅返回一行以提高性能(不使用 setMaxResult),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36734322/

相关文章:

java - 在 JSF 自定义 validator 中区分 ajax 请求和完整请求

mysql - 如何使用 Outer Join 和 Group By 在查询中包含 NULL 值

java - 如何使用 Criteria Query 获取 Hibernate 中的记录列表

java - 实际和形式参数列表的长度不同,但它们实际上是相同的

java - Graphics.drawString 与前一个字符重叠

sql - 在 CASE 表达式中将 DateTime 变量设置为 NULL

java - SQL迭代器的实现

java - 在双向持久化子实体时如何级联父实体

java - @NamedQuery INNER JOIN 不起作用

java - JButton 边距。灵光一现时不受尊重