如果表(非常大的表)中存在任何具有相同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的解决方案吗?
由于
艾登
答案 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,则表示您有重复项。