2016-12-05 148 views
1

我想檢查數據庫中的一列是不是一個空字符串或不爲空,但我無法弄清楚如何使用條件生成器查詢來做到這一點,以獲得回到實際的對象。這個SQL工作:Java條件生成器查詢不爲空或空

sampleName is not null and sampleName != '' 

但是當我嘗試用標準做構建器這樣的:

//這是一個私有方法filterBySampleNotEmpty

cb.notEqual(root.get("sampleName"), ""); 

通過這另一種方法叫

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); 
CriteriaQuery<Sample> query = criteriaBuilder.createQuery(Sample.class); 
Root model = query.from(Sample.class); 
List<Predicate> predicates = new ArrayList<>(); 
predicates.add(filterBySampleNotEmpty(model, criteriaBuilder)); 
query.select(model).where(predicates.toArray(new Predicate[]{})); 

它仍然返回整個列表。

+0

你能告訴更多的代碼嗎?你是如何構建/配置cb和root的? –

+0

@EddieCurtis我不好,我加了更多。 – Crystal

+0

在'where'子句中,你可以嘗試'predicates.toArray(new Predicate [predicates.size()]'並且看看它是否有效嗎? – VHS

回答

1

請與以下

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); 
CriteriaQuery<Sample> query = criteriaBuilder.createQuery(Sample.class); 
MetaModel m = em.getMetaModel(); 
EntityType<Sample> entity = m.entity(Sample.class); 
Root model = query.from(Sample.class); 
query.where(criteriaBuilder.notEqual(model.get(entity.name), 「」)).and(criteriaBuilder.notEqual(model.get(entity.name), null)); 
+0

notEqual不能在查詢中調用 – Crystal

+0

是的,犯了一個錯誤@Crystal .. notEquals必須在'CriteriaBuilder'編輯我的答案請檢查相同 – lsof

+0

請參考以下java文檔https://docs.oracle。 com/cd/E19798-01/821-1841/gjixa/index.html - 瞭解更多.. – lsof

0

標準生成器「notEqual」標準測試兩個表達式不相等。我看不到標準來過濾空值,除非我遺漏了某些東西。

+0

是的,我正在嘗試使用空字符串,但無法使其工作。 – Crystal

0

在'where'子句中,嘗試predicates.toArray(new Predicate[predicates.size()]並查看它是否有效。當您將List轉換爲Array時,由於傳遞的是空數組,因此您將大小指定爲0。

0

試一試使用此代碼:

criteriaBuilder.isNotNull(model.get(entity.name)) 
+1

嘗試在你的回答中給出更多的上下文。參見[這裏](https://stackoverflow.com/help/how-to-answer) – SilverNak