簡體   English   中英

JPQL標准查詢播放框架1x內部聯接和子句構造位置

[英]JPQL Criteria Query Play Framework 1x Inner Join And Where Clause Construction

我一直在嘗試在JPA中構建以下SQL查詢(對於Java和JPA還是新手,我進行了很多搜索,但仍然沒有得到它,抱歉,這是一個菜鳥問題)。

JPQL查詢幾乎可以完成我想要的工作

SELECT s
FROM Sentence s
INNER JOIN s.words sw
WHERE s.date = :date
AND sw IN (:words)

SentenceWord和Word都是類SentenceWord是Sentence和Word之間的ManyToMany連接。 所以s.words是一個屬於句子的列表。 s.Date是一個Import對象,用於存儲東西數據:import:date是我們要匹配的單個Import。 :words是我們要在句子中檢查的單詞的列表。

該查詢對於IN運算符來說很好用。

但是,現在我們需要檢查一個句子是否包含我們要傳遞的列表中的所有單詞(我們是從s.words列表中匯編出來的)。

現在,我只是使用字符串生成器和FOR EACH循環手動構建WHERE AND子句,並將它們附加到String和using Query。 它可以工作,但是它非常丑陋,而且似乎是反Javay的,我想以正確/類型安全的方式來做。

我找到了CriteriaBuilder和CriteriaQuery,但一直無法使INNER JOIN正常工作。 完全沒有 遺憾的是,這是在我執行RTFM之后。 http://docs.jboss.org/hibernate/orm/4.0/hem/zh-CN/html/querycriteria.html#querycriteria-from-join

對於動態WHERE AND查詢,據我所知

q.where(
    cb.and(
        cb.equal(s.get("date"), date)

        for (Word word : words) {
            , cd.equal(s.get("words"), word)          
        }

    )
);

但這似乎全錯了,我無法測試它,因為我無法進行連接。 如果有人可以為我指明正確方向的CriteriaQuery教程,該教程針對簡單人員的聯接並遍歷Collection以創建AND子句,或在此示例中寫出正確的查詢,我將非常感謝!

更新-查詢效率

替代的JPQL查詢將是:

SELECT s 
FROM Sentence s
INNER JOIN s.words sw
WHERE s.date = :date
AND sw IN (:words)
GROUP BY s
HAVING count(sw) = :numberOfWords

JQPL似乎需要Group By,但對於SQL中的同一查詢則不需要。 我現在只有一個很小的數據集,所以兩者都非常快,但很好奇是否一個比另一個更受歡迎。

另外,我只是使用Query設置參數,是否有更好的類可用於這些參數? 我喜歡命名術語勝過?。

Query query = JPA.em().createQuery(jpql);
query.setParameter("date", date);
query.setParameter("numberOfWords", new Long(words.size()));
query.setParameter("words", words);

以下查詢應執行所需的操作。 不知道是否有更好的選擇:

select s 
from Sentence s
where s.date = :date
and :numberOfWords = (select count(sw) from SentenceWord sw
                      where sw.sentence = s
                      and sw in (:words))

其中numberOfWords是包含在要匹配的單詞集合中的單詞數。 當然,此集合不得包含任何重復項。

解釋查詢的作用:它檢查要匹配的單詞集中的單詞數等於該集合中被句子引用的單詞部分的數量。

您可以在游戲中使用JpqlSelect來用and和equal來動態構建查詢

JpqlSelect select = new JpqlSelect();
Map<String, Object> params = new HashMap<String, Object>();
select.select("s");
select.from("Sentence s inner join s.words sw");
select.where("where s.date = ?");
params.param(date);
for (Word word : words) {
    select.andWhere("sw = ?");
}
return fin(select.toString(), select.getParams());

但我不認為此查詢是您要使用的句子中所有單詞都不等於單詞參數中每個單詞的查詢。 我認為對JB的查詢更好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM