2012-07-30 96 views
0

isUnique應該只檢查一個新聞組的存在,並返回一個布爾值反映:查詢一行JPA JQL EXIST

init: 
Deleting: /home/thufir/NetBeansProjects/USENET/build/built-jar.properties 
deps-jar: 
Updating property file: /home/thufir/NetBeansProjects/USENET/build/built-jar.properties 
compile: 
run: 
DEBUG: nntp: newsrc loading /home/thufir/.newsrc 
DEBUG: nntp: newsrc load: 5 groups in 26ms 
Jul 29, 2012 8:37:13 PM net.bounceme.dur.usenet.driver.Main getFolders 
INFO: [gwene.com.androidcentral, gwene.com.blogspot.emacsworld, gwene.com.blogspot.googlecode, gwene.com.blogspot.googlereader, gwene.com.economist] 
[EL Info]: 2012-07-29 20:37:17.607--ServerSession(20908501)--EclipseLink, version: Eclipse Persistence Services - 2.3.0.v20110604-r9504 
[EL Info]: 2012-07-29 20:37:19.815--ServerSession(20908501)--file:/home/thufir/NetBeansProjects/USENET/build/classes/_USENETPU login successful 
Jul 29, 2012 8:37:20 PM net.bounceme.dur.usenet.driver.Main persist 
INFO: gwene.com.androidcentral 
Jul 29, 2012 8:37:20 PM net.bounceme.dur.usenet.driver.Main isUnique 
INFO: [] 
Jul 29, 2012 8:37:20 PM net.bounceme.dur.usenet.driver.Main isUnique 
INFO: gwene.com.androidcentral new 
Jul 29, 2012 8:37:20 PM net.bounceme.dur.usenet.driver.Main persist 
INFO: gwene.com.blogspot.emacsworld 
Jul 29, 2012 8:37:20 PM net.bounceme.dur.usenet.driver.Main isUnique 
INFO: [gwene.com.androidcentral] 
Jul 29, 2012 8:37:20 PM net.bounceme.dur.usenet.driver.Main isUnique 
INFO: gwene.com.blogspot.emacsworld new 
Jul 29, 2012 8:37:20 PM net.bounceme.dur.usenet.driver.Main persist 
INFO: gwene.com.blogspot.googlecode 
Jul 29, 2012 8:37:20 PM net.bounceme.dur.usenet.driver.Main isUnique 
INFO: [gwene.com.androidcentral, gwene.com.blogspot.emacsworld] 
Jul 29, 2012 8:37:20 PM net.bounceme.dur.usenet.driver.Main isUnique 
INFO: gwene.com.blogspot.googlecode new 
Jul 29, 2012 8:37:20 PM net.bounceme.dur.usenet.driver.Main persist 
INFO: gwene.com.blogspot.googlereader 
Jul 29, 2012 8:37:20 PM net.bounceme.dur.usenet.driver.Main isUnique 
INFO: [gwene.com.androidcentral, gwene.com.blogspot.emacsworld, gwene.com.blogspot.googlecode] 
Jul 29, 2012 8:37:20 PM net.bounceme.dur.usenet.driver.Main isUnique 
INFO: gwene.com.blogspot.googlereader new 
Jul 29, 2012 8:37:20 PM net.bounceme.dur.usenet.driver.Main persist 
INFO: gwene.com.economist 
Jul 29, 2012 8:37:20 PM net.bounceme.dur.usenet.driver.Main isUnique 
INFO: [gwene.com.androidcentral, gwene.com.blogspot.emacsworld, gwene.com.blogspot.googlecode, gwene.com.blogspot.googlereader] 
Jul 29, 2012 8:37:20 PM net.bounceme.dur.usenet.driver.Main isUnique 
INFO: gwene.com.economist new 
BUILD SUCCESSFUL (total time: 9 seconds) 

從查詢數據庫,這似乎工作作爲標榜。然而,這似乎是錯誤的查詢類型:

package net.bounceme.dur.usenet.driver; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.logging.Logger; 
import javax.mail.Folder; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import javax.persistence.TypedQuery; 
import net.bounceme.dur.usenet.model.Newsgroups; 
import net.bounceme.dur.usenet.model.Usenet; 

public class Main { 

    private static final Logger LOG = Logger.getLogger(Main.class.getName()); 
    private Usenet u = Usenet.INSTANCE; 

    public static void main(String[] args) { 
     Main main = new Main(); 
    } 

    public Main() { 
     List<Newsgroups> folderGroups = getFolders(); 
     EntityManagerFactory emf; 
     EntityManager em; 
     emf = Persistence.createEntityManagerFactory("USENETPU"); 
     em = emf.createEntityManager(); 
     for (Newsgroups n : folderGroups) { 
      persist(em, n); 
     } 
     em.close(); 
    } 

    private void persist(EntityManager em, Newsgroups newNewsgroup) { 
     LOG.info(newNewsgroup.toString()); 
     TypedQuery<Newsgroups> query = em.createQuery("SELECT n FROM Newsgroups n", Newsgroups.class); 
     List<Newsgroups> results = query.getResultList(); 
     if (isUnique(newNewsgroup, results)) { 
      em.getTransaction().begin(); 
      em.persist(newNewsgroup); 
      em.getTransaction().commit(); 
     } 
    } 

    private boolean isUnique(Newsgroups newNewsgroup, Iterable<Newsgroups> results) { 
     LOG.info(results.toString()); 
     for (Newsgroups existingNewsgroup : results) { 
      if ((existingNewsgroup.getNewsgroup().equals(newNewsgroup.getNewsgroup()))) { 
       return false; 
      } 
     } 
     LOG.info(newNewsgroup + "\tnew"); 
     return true; 
    } 

    private boolean queryDB2(EntityManager em, Newsgroups ng) { 
     String newsgroup = ng.getNewsgroup(); 
     TypedQuery<Newsgroups> query = em.createQuery("SELECT n FROM Newsgroups n WHERE n.newsgroup = :newsgroup", Newsgroups.class); 
     Newsgroups result = query.getSingleResult(); 
     LOG.info("query result:\n" + result + "\ncompared to\n" + ng); 
     return false; 
    } 

    private List<Newsgroups> getFolders() { 
     List<Folder> folders = u.getFolders(); 
     List<Newsgroups> newsgroups = new ArrayList<>(); 
     for (Folder folder : folders) { 
      Newsgroups newsgroup = new Newsgroups(folder); 
      newsgroups.add(newsgroup); 
     } 
     LOG.info(newsgroups.toString()); 
     return newsgroups; 
    } 
} 

在哪裏,而不是使用isUnique通過查詢結果進行迭代,這將是一個匹配的語法?

我看到在SQL有一個EXISTS關鍵詞。我怎樣才能將isUnique方法變成僅存在的查詢?

回答

0

您可以嘗試簡單的查詢,如:

SELECT 1 
FROM Newsgroups n 
WHERE newNewsgroup = 'newNewsgroup' 
LIMIT 1;