Search in sources :

Example 1 with RelationalPersistentEntity

use of org.springframework.data.relational.core.mapping.RelationalPersistentEntity in project spring-data-jdbc by spring-projects.

the class RelationalExampleMapper method getMappedExample.

/**
 * Transform each property of the {@link Example}'s probe into a {@link Criteria} and assemble them into a
 * {@link Query}.
 *
 * @param example
 * @param entity
 * @return query
 */
private <T> Query getMappedExample(Example<T> example, RelationalPersistentEntity<?> entity) {
    Assert.notNull(example, "Example must not be null!");
    Assert.notNull(entity, "RelationalPersistentEntity must not be null!");
    PersistentPropertyAccessor<T> propertyAccessor = entity.getPropertyAccessor(example.getProbe());
    ExampleMatcherAccessor matcherAccessor = new ExampleMatcherAccessor(example.getMatcher());
    final List<Criteria> criteriaBasedOnProperties = new ArrayList<>();
    entity.doWithProperties((PropertyHandler<RelationalPersistentProperty>) property -> {
        if (matcherAccessor.isIgnoredPath(property.getName())) {
            return;
        }
        Optional<?> optionalConvertedPropValue = matcherAccessor.getValueTransformerForPath(property.getName()).apply(Optional.ofNullable(propertyAccessor.getProperty(property)));
        if (!optionalConvertedPropValue.isPresent()) {
            return;
        }
        Object convPropValue = optionalConvertedPropValue.get();
        boolean ignoreCase = matcherAccessor.isIgnoreCaseForPath(property.getName());
        String column = property.getName();
        switch(matcherAccessor.getStringMatcherForPath(property.getName())) {
            case DEFAULT:
            case EXACT:
                criteriaBasedOnProperties.add(includeNulls(example) ? Criteria.where(column).isNull().or(column).is(convPropValue).ignoreCase(ignoreCase) : Criteria.where(column).is(convPropValue).ignoreCase(ignoreCase));
                break;
            case ENDING:
                criteriaBasedOnProperties.add(includeNulls(example) ? Criteria.where(column).isNull().or(column).like("%" + convPropValue).ignoreCase(ignoreCase) : Criteria.where(column).like("%" + convPropValue).ignoreCase(ignoreCase));
                break;
            case STARTING:
                criteriaBasedOnProperties.add(includeNulls(example) ? Criteria.where(column).isNull().or(column).like(convPropValue + "%").ignoreCase(ignoreCase) : Criteria.where(column).like(convPropValue + "%").ignoreCase(ignoreCase));
                break;
            case CONTAINING:
                criteriaBasedOnProperties.add(includeNulls(example) ? Criteria.where(column).isNull().or(column).like("%" + convPropValue + "%").ignoreCase(ignoreCase) : Criteria.where(column).like("%" + convPropValue + "%").ignoreCase(ignoreCase));
                break;
            default:
                throw new IllegalStateException(example.getMatcher().getDefaultStringMatcher() + " is not supported!");
        }
    });
    // Criteria, assemble!
    Criteria criteria = Criteria.empty();
    for (Criteria propertyCriteria : criteriaBasedOnProperties) {
        if (example.getMatcher().isAllMatching()) {
            criteria = criteria.and(propertyCriteria);
        } else {
            criteria = criteria.or(propertyCriteria);
        }
    }
    return Query.query(criteria);
}
Also used : Query(org.springframework.data.relational.core.query.Query) MappingContext(org.springframework.data.mapping.context.MappingContext) ExampleMatcher(org.springframework.data.domain.ExampleMatcher) Example(org.springframework.data.domain.Example) PersistentPropertyAccessor(org.springframework.data.mapping.PersistentPropertyAccessor) ArrayList(java.util.ArrayList) PropertyHandler(org.springframework.data.mapping.PropertyHandler) ExampleMatcherAccessor(org.springframework.data.support.ExampleMatcherAccessor) List(java.util.List) Optional(java.util.Optional) Criteria(org.springframework.data.relational.core.query.Criteria) RelationalPersistentEntity(org.springframework.data.relational.core.mapping.RelationalPersistentEntity) RelationalPersistentProperty(org.springframework.data.relational.core.mapping.RelationalPersistentProperty) Assert(org.springframework.util.Assert) Optional(java.util.Optional) ArrayList(java.util.ArrayList) ExampleMatcherAccessor(org.springframework.data.support.ExampleMatcherAccessor) Criteria(org.springframework.data.relational.core.query.Criteria) RelationalPersistentProperty(org.springframework.data.relational.core.mapping.RelationalPersistentProperty)

Example 2 with RelationalPersistentEntity

use of org.springframework.data.relational.core.mapping.RelationalPersistentEntity in project spring-data-jdbc by spring-projects.

the class BasicRelationalConverterUnitTests method shouldUseConvertingPropertyAccessor.

// DATAJDBC-235
@Test
@SuppressWarnings("unchecked")
void shouldUseConvertingPropertyAccessor() {
    RelationalPersistentEntity<MyEntity> entity = (RelationalPersistentEntity) context.getRequiredPersistentEntity(MyEntity.class);
    MyEntity instance = new MyEntity();
    PersistentPropertyAccessor<MyEntity> accessor = converter.getPropertyAccessor(entity, instance);
    RelationalPersistentProperty property = entity.getRequiredPersistentProperty("flag");
    accessor.setProperty(property, "1");
    assertThat(instance.isFlag()).isTrue();
}
Also used : RelationalPersistentEntity(org.springframework.data.relational.core.mapping.RelationalPersistentEntity) RelationalPersistentProperty(org.springframework.data.relational.core.mapping.RelationalPersistentProperty) Test(org.junit.jupiter.api.Test)

Aggregations

RelationalPersistentEntity (org.springframework.data.relational.core.mapping.RelationalPersistentEntity)2 RelationalPersistentProperty (org.springframework.data.relational.core.mapping.RelationalPersistentProperty)2 ArrayList (java.util.ArrayList)1 List (java.util.List)1 Optional (java.util.Optional)1 Test (org.junit.jupiter.api.Test)1 Example (org.springframework.data.domain.Example)1 ExampleMatcher (org.springframework.data.domain.ExampleMatcher)1 PersistentPropertyAccessor (org.springframework.data.mapping.PersistentPropertyAccessor)1 PropertyHandler (org.springframework.data.mapping.PropertyHandler)1 MappingContext (org.springframework.data.mapping.context.MappingContext)1 Criteria (org.springframework.data.relational.core.query.Criteria)1 Query (org.springframework.data.relational.core.query.Query)1 ExampleMatcherAccessor (org.springframework.data.support.ExampleMatcherAccessor)1 Assert (org.springframework.util.Assert)1