[英]Database updated but select query not giving result in hibernate
我在Hibernate上使用JPA,並且它以TokuDb作為引擎連接到MariaDb。
我正在運行一個無限循環,該循環正在檢查表是否基於某些標志有新行,如果找到新行,則對其進行處理。
但是,如果循環運行,如果您使用不同的線程/機制將數據插入表中,則會發生問題,JPA查詢未找到結果,因此始終不返回任何新行。 代碼如下
do {
try {
if (!em.isOpen()) {
em = PersistenceLocal.getEntityManager();
}
TypedQuery<FileMaster> query = em.createQuery("SELECT f FROM FileMaster f WHERE f.misUpdated = :misUpdated AND f.status = :status", FileMaster.class);
query.setParameter("misUpdated", false);
query.setParameter("status", "sent");
query.set
List<FileMaster> result = query.getResultList();
if (result.size() > 0) {
EntityTransaction tx = em.getTransaction();
tx.begin();
for (FileMaster fm : result) {
SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd");
String dt = dateFormat.format(fm.getSheduleDate());
// find out what is the uid in file master
TypedQuery<Misthird> misthird = em.createNamedQuery("Misthird.findByPrimarKey", Misthird.class);
misthird.setParameter("uid", Integer.valueOf(fm.getCrn()));
misthird.setParameter("dt", fm.getSheduleDate(), TemporalType.DATE);
Misthird m;
try {
m = misthird.getSingleResult();
} catch (Exception ex) {
m = new Misthird(Integer.valueOf(fm.getCrn()), fm.getSheduleDate());
}
Calendar c = Calendar.getInstance();
c.setTime(fm.getSheduleDate());
//System.out.println("Scheduled Date = "+fm.getSheduleDate());
int hr = c.get(Calendar.HOUR_OF_DAY);
System.out.println("Hour = " + hr);
switch (hr) {
case 0:
m.setHr(m.getHr() + fm.getTRecord());
break;
case 1:
m.setHr1(m.getHr1() + fm.getTRecord());
break;
case 2:
m.setHr2(m.getHr2() + fm.getTRecord());
break;
case 3:
m.setHr3(m.getHr3() + fm.getTRecord());
break;
case 4:
m.setHr4(m.getHr4() + fm.getTRecord());
break;
case 5:
m.setHr5(m.getHr5() + fm.getTRecord());
break;
case 6:
m.setHr6(m.getHr6() + fm.getTRecord());
break;
case 7:
m.setHr7(m.getHr7() + fm.getTRecord());
break;
case 8:
m.setHr8(m.getHr8() + fm.getTRecord());
break;
case 9:
m.setHr9(m.getHr9() + fm.getTRecord());
break;
case 10:
m.setHr10(m.getHr10() + fm.getTRecord());
break;
case 11:
m.setHr11(m.getHr11() + fm.getTRecord());
break;
case 12:
m.setHr12(m.getHr12() + fm.getTRecord());
break;
case 13:
m.setHr13(m.getHr13() + fm.getTRecord());
break;
case 14:
m.setHr14(m.getHr14() + fm.getTRecord());
break;
case 15:
m.setHr15(m.getHr15() + fm.getTRecord());
break;
case 16:
m.setHr16(m.getHr16() + fm.getTRecord());
break;
case 17:
m.setHr17(m.getHr17() + fm.getTRecord());
break;
case 18:
m.setHr18(m.getHr18() + fm.getTRecord());
break;
case 19:
m.setHr19(m.getHr19() + fm.getTRecord());
break;
case 20:
m.setHr20(m.getHr20() + fm.getTRecord());
break;
case 21:
m.setHr21(m.getHr21() + fm.getTRecord());
break;
case 22:
m.setHr22(m.getHr22() + fm.getTRecord());
break;
case 23:
m.setHr23(m.getHr23() + fm.getTRecord());
break;
}
// update total records
m.setTot(m.getTot() + fm.getTRecord());
System.out.println("Total = " + m.getTot());
if (em.contains(m)) {
em.persist(m);
} else {
m = em.merge(m);
em.persist(m);
}
// create a new table for fileid and misupdated status, use trigger and keep filemaster free.
if (!em.contains(fm)) {
fm = em.merge(fm);
}
fm.setMisUpdated(true);
em.persist(fm);
}
System.out.println("MIS updated and Transaction Commited " + new Date());
tx.commit();
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
em.close();
Thread.sleep(1000);
} catch (Exception ex) {
ex.printStackTrace();
}
}
} while (cron_mode);
}
的SQL
Hibernate: select filemaster0_.FileID as FileID1_3_, filemaster0_.after_rev as after_re2_3_, filemaster0_.apx_priotity as apx_prio3_3_, filemaster0_.befor_rev as befor_re4_3_, filemaster0_.cancel_date as cancel_d5_3_, filemaster0_.cp as cp6_3_, filemaster0_.credit as credit7_3_, filemaster0_.CRN as CRN8_3_, filemaster0_.cut as cut9_3_, filemaster0_.dnd_Checked as dnd_Che10_3_, filemaster0_.download_status as downloa11_3_, filemaster0_.FileName as FileNam12_3_, filemaster0_.gateway as gateway13_3_, filemaster0_.is_credit_revers as is_cred14_3_, filemaster0_.is_credit_reversed as is_cred15_3_, filemaster0_.mis_updated as mis_upd16_3_, filemaster0_.modem_distibute as modem_d17_3_, filemaster0_.msg as msg18_3_, filemaster0_.pid as pid19_3_, filemaster0_.priority as priorit20_3_, filemaster0_.sender_id as sender_21_3_, filemaster0_.shedule_date as shedule22_3_, filemaster0_.signature as signatu23_3_, filemaster0_.Status as Status24_3_, filemaster0_.t_record as t_recor25_3_, filemaster0_.t_reversal as t_rever26_3_, filemaster0_.type as type27_3_, filemaster0_.unicode as unicode28_3_, filemaster0_.UploadDate as UploadD29_3_ from file_master filemaster0_ where filemaster0_.mis_updated=? and filemaster0_.Status=?
您可以在em.close()
之前執行session.flush()
(在您的情況下為em.flush()
),它可能會起作用。
交易完成后,我使用了提示並清除了entitymanager。
query.setHint("javax.persistence.cache.retrieveMode", CacheStoreMode.BYPASS);
query.setHint("javax.persistence.cache.storeMode", CacheStoreMode.BYPASS);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.