2015-10-23 4 views
0

Мне нужна помощь в создании предиката для использования с данными Spring и querydsl. Я в процессе преобразования Daos в репозитории. И я столкнулся с тем, у которого есть динамический запрос. Я могу создать предикат из списка, но я теряюсь в том, как создать динамический предикат с карты. Вот код из DaoImpl, что я конвертирование из:Создать предикат querydsl с карты

public Set<String> getDocumentsByDocumentAssociation(Map.Entry<String,String>[] associations) { 
String queryStr = "SELECT da FROM DocumentExternalAssocEntity as da WHERE"; 
     StringBuilder sb = new StringBuilder(queryStr); 

    //loop through inputs. for first loop, skip appending the OR statements. Append OR for all others 
    for (int i = 0; i < associations.length; i++){ 
     if (i > 0) { 
      sb.append(" OR"); 
     } 
     String whereString = " (da.associationtype = :docAssocType" + i + " AND da.associationvalue = :docAssocValue" + i + ")"; 
     sb.append(whereString); 
    } 

    //query when previous loop is done appending 
    final Query query = em.createQuery(sb.toString());   
    for(int i = 0; i < associations.length; i++) { 
     query.setParameter("docAssocType" + i, associations[i].getKey()); 
     query.setParameter("docAssocValue" + i, associations[i].getValue()); 
    } 

А вот соответствующий сгенерированный класс:

private static final long serialVersionUID = 1971644089L; 

public static final QDocumentExternalAssocEntity documentExternalAssocEntity = new QDocumentExternalAssocEntity("documentExternalAssocEntity"); 

public final StringPath associationtype = createString("associationtype"); 

public final StringPath associationvalue = createString("associationvalue"); 

Спасибо, и дайте мне знать, если вам нужна дополнительная информация

ответ

0

Это следует сделать это:

BooleanExpression expr = null; 
for (int i = 0; i < associations.length; i++){ 
    BooleanExpression innerExpr = 
     documentExternalAssocEntity.associationtype.eq(associations[i].getKey()) 
      .and(documentExternalAssocEntity.associationvalue.eq(associations[i].getValue())) 
    if (expr == null) { 
     expr = innerExpr; 
    } else { 
     expr = expr.or(innerExpr); 
    } 
} 
+0

для агрегации вы также можете использовать 'BooleanBuilder'. –

Смежные вопросы