在hibernate中使用EXISTS仅为性能返回一行(没有setMaxResult)

时间:2016-04-20 05:08:46

标签: 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结合使它只返回一行然后我检查大小&gt; 0,这将是有效的。

或者只是setMaxResult的解决方案吗?

由于

艾登

1 个答案:

答案 0 :(得分:1)

由于您在考虑具有相同SELECT COUNT(p) FROM Person p GROUP BY p.PersonName HAVING COUNT(p) > 1 的基础上重复记录,因此以下HQL查询应该可以解决这个问题:

var text = ["Question Everything!", "Envision the future!", "Change your perspective!"];
var counter = 0;
var elem = document.getElementById("slogantxt");
setInterval(change, 3500);
function change() {
 fade(elem,function(){
    elem.innerHTML = text[counter];
    unfade(elem);
 }); 
 counter++;
 if(counter >= text.length) { counter = 0; }
}


function fade(element,cbk) {
   var op = 1;  // initial opacity
   var timer = setInterval(function () {
       if (op <= 0.1){
           clearInterval(timer);
           element.style.display = 'none';
           cbk();
       }
       element.style.opacity = op;
       element.style.filter = 'alpha(opacity=' + op * 100 + ")";
       op -= op * 0.1;
   }, 50);
}

function unfade(element) {
   var op = 0.1;  // initial opacity
   element.style.display = 'block';
    var timer = setInterval(function () {
       if (op >= 1){
           clearInterval(timer);
       }
       element.style.opacity = op;
       element.style.filter = 'alpha(opacity=' + op * 100 + ")";
       op += op * 0.1;        
   }, 10);
}

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