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();
Sadece yüklem ve ifadenizi birlikte eklemeyi denediniz mi? createQuery.where (criteriaBuilder.and (predicateNull, regExprLike)); – Chris
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
@ user613114 bunu hiç anladın mı? – Crystal