2014-10-09 35 views
12

numaralı makalede ifadeyi ve ifadeyi nereye yazarım, nerede tek eşleme ve ifadem var.JPA: Hem QueryCriteria'da hem de

Expression<String> col1 = tableEntity.get("col1"); 
Expression<String> regExpr = criteriaBuilder.literal("\\.\\d+$"); 
Expression<Boolean> regExprLike = criteriaBuilder.function("regexp_like", Boolean.class, col, regExpr); 

Expression<TableEntity> col2= tableEntity.get("col2"); 
Predicate predicateNull = criteriaBuilder.isNull(col2); 

createQuery.where(cb.and(predicateNull)); 
createQuery.where(regExprLike); 

Bu durumda ben böyle bir şey yapmak mümkün değilim: Ve her ikisi de fıkra nerede ANDed gereken createQuery.where (predicateNull, regExprLike);

Ben CriteriaBuilder en isTrue() yöntemini kullanarak çalıştı:

Predicate predicateNull = criteriaBuilder.isNull(col2); 
Predicate predicateTrue = criteriaBuilder.isTrue(regExprLike); 
createQuery.where(predicateNull, predicateTrue); 

Ama yardımcı olmadı.

Kriterler Sorgulama, her ikisinde de, tümcede olduğu gibi, ifadelere veya ifadelere izin verir. Herhangi bir fikir QueryCriteria'nın deyimindeki ikisini, tahminlerini ve ifadelerini nasıl kullanabilirim?

Güncelleme 10 Ekim 2014: Chris önerdiği gibi , ben kullanmaya çalıştı:

createQuery.where(predicateNull, regExprLike); 

Ama benim sorgu durumla başarısız:

Caused by: org.jboss.arquillian.test.spi.ArquillianProxyException: org.hibernate.hql.internal.ast.QuerySyntaxException : unexpected AST node: (near line 1, column 311 [select coalesce(substring(generatedAlias0.col1,0,(locate(regexp_substr(generatedAlias0.col1, :param0), 
generatedAlias0.col1)-1)), generatedAlias0.col1), generatedAlias0.col1 
from com.temp.TableEntity as generatedAlias0 
where (generatedAlias0.col2 is null) and (regexp_like(generatedAlias0.col1, :param1))] [Proxied because : Original exception not deserilizable, ClassNotFoundException] 

Kodum görünüyor gibi:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 
CriteriaQuery<Object[]> createQuery = criteriaBuilder.createQuery(Object[].class); 

Root<TableEntity> tableEntity = createQuery.from(TableEntity.class); 

Expression<String> path = tableEntity.get("col1"); 

Expression<String> regExpr = criteriaBuilder.literal("\\.\\d+$"); 
Expression<String> regExprSubStr = criteriaBuilder.function("regexp_substr", String.class, path, regExpr); 

Expression<Boolean> regExprLike = criteriaBuilder.function("regexp_like", Boolean.class, path, regExpr); 


Expression<Integer> l3 = criteriaBuilder.locate(path, regExprSubStr); 
Expression<Integer> minusOne = criteriaBuilder.literal(1); 
Expression<Integer> l3Sub1 = criteriaBuilder.diff(l3, minusOne); 
Expression<Integer> zeroIndex = criteriaBuilder.literal(0); 
Expression<String> s3 = criteriaBuilder.substring(path, zeroIndex, l3Sub1); 

Expression<TableEntity> col1 = tableEntity.get("col1"); 
Expression<TableEntity> col2 = tableEntity.get("col2"); 

Expression<String> coalesceExpr = criteriaBuilder.coalesce(s3, path); 
createQuery.multiselect(coalesceExpr, col1); 

Predicate predicateNull = criteriaBuilder.isNull(col2); 

createQuery.where(criteriaBuilder.and(predicateNull, regExprLike)); 
String query = entityManager.createQuery(createQuery).unwrap(org.hibernate.Query.class).getQueryString(); 
+0

Sadece yüklem ve ifadenizi birlikte eklemeyi denediniz mi? createQuery.where (criteriaBuilder.and (predicateNull, regExprLike)); – Chris

+0

Evet denedim. Herhangi bir derleme zamanı hatası almıyorum, ancak sorgu oluşturmam başarısız oluyor. Sorumu en son güncellemelerle güncelledim. Daha fazla bilgiye sahipseniz lütfen bana bildirin. Teşekkürler. – user613114

+0

@ user613114 bunu hiç anladın mı? – Crystal

cevap

2

Sanırım probleminiz oracle 'regexp_like' işlevini bir işlev olarak sınıflandırmıyor. o iş yapmak için, yeni kayıtlı fonksiyonu ile Oracle lehçesini uzatmak zorunda:

public class Oracle12cExtendedDialect extends Oracle12cDialect { 

public Oracle12cExtendedDialect() { 
    super(); 
    registerFunction(
      "regexp_like", new SQLFunctionTemplate(StandardBasicTypes.BOOLEAN, 
        "(case when (regexp_like(?1, ?2)) then 1 else 0 end)") 
    ); 
} 
} 

ve sonra da fıkra değiştirebilirsiniz: Elbette

 createQuery.where(criteriaBuilder.and(predicateNull, criteriaBuilder.equal(regExprLike, 1))); 

, senin içinde yeni lehçesini kayıt var persistence.xml

  <property name="hibernate.dialect" value="path.to.your.dialect.class.Oracle12cExtendedDialect" /> 
+0

Her nasılsa, yaklaşımınızın bana aynı hataları verdiğini düşündüğüm için "createQuery.where (ölçütlerBuilder.and (predicateNull, regExprLike)) denedim." Ama hatamı anladım ve aynen önerildiği gibi denedim. Ve bammm .. Bir çekicilik gibi çalıştı :) Zaman ve çabalarınız için çok teşekkürler :) – user613114

İlgili konular