arnaudroger / SimpleFlatMapper

Fast and Easy mapping from database and csv to POJO. A java micro ORM, lightweight alternative to iBatis and Hibernate. Fast Csv Parser and Csv Mapper
http://simpleflatmapper.org
MIT License
438 stars 76 forks source link

SelectQueryMapper should support LocalDate #710

Closed khauser closed 4 years ago

khauser commented 4 years ago

Having a simple SQL:

        SelectSeekStep1<Record4<Long, LocalDate, String, BigDecimal>, LocalDate> sql1 = dsl
                .select(booking.ID, booking.BOOKING_DATE, booking.NAME, booking.VALUE)//
                .from(booking)//
                .orderBy(booking.BOOKING_DATE.desc());
        JdbcMapper<Booking> testMapper = JdbcMapperFactory.newInstance()
                .newMapper(Booking.class);      

does deliver results with filled booking_date field, whereas

        SelectQueryMapper<Booking> mapper = SelectQueryMapperFactory.newInstance().newMapper(Booking.class);

delivers an empty field.

arnaudroger commented 4 years ago

will have a look thanks for the report

arnaudroger commented 4 years ago

that should be fixed in 8.2.2

khauser commented 4 years ago

I have upgraded now, but stuck in a case #658 we had in 2019 ;) with this inheritance strategy.

The following lines do not compile anymore:

JdbcMapper<TopicOverviewItem> mapper2 = JdbcMapperFactory.newInstance()
                        .discriminator(BaseTestPlan.class, builder -> builder.when(rs -> true, DwhTestPlan.class))
                        .newMapper(TopicOverviewItem.class);

I already replaced rs -> true with rs -> ConstantPredicate.truePredicate() while eclipse then shows me:

The method when(Function<List<JdbcColumnKey>,Predicate<ResultSet>>, Class<? extends BaseTestPlan>) is ambiguous for the type AbstractMapperFactory.DiscriminatorBuilder<ResultSet,JdbcColumnKey,BaseTestPlan>

Next try was with the compiling lines:

JdbcMapper<TopicOverviewItem> mapper2 = JdbcMapperFactory.newInstance()
                        .discriminator(BaseTestPlan.class).with(DwhTestPlan.class)
                        .newMapper(TopicOverviewItem.class);

which ends in a:

java.lang.ClassCastException: org.simpleflatmapper.reflect.ClassMetaWithDiscriminatorId cannot be cast to org.simpleflatmapper.reflect.meta.ClassMeta
    at org.simpleflatmapper.map.impl.DiscriminatorReflectionService.newClassMeta(DiscriminatorReflectionService.java:85)
    at org.simpleflatmapper.map.impl.DiscriminatorReflectionService.getClassMeta(DiscriminatorReflectionService.java:69)
    at org.simpleflatmapper.reflect.meta.PropertyMeta.newPropertyClassMeta(PropertyMeta.java:53)
    at org.simpleflatmapper.reflect.meta.PropertyMeta.getPropertyClassMeta(PropertyMeta.java:46)
    at org.simpleflatmapper.reflect.meta.ObjectPropertyFinder.lookForSubProperty(ObjectPropertyFinder.java:288)
    at org.simpleflatmapper.reflect.meta.ObjectPropertyFinder.lookForProperty(ObjectPropertyFinder.java:218)
    at org.simpleflatmapper.reflect.meta.ObjectPropertyFinder.lookForProperties(ObjectPropertyFinder.java:72)
    at org.simpleflatmapper.reflect.meta.PropertyFinder.lookForProperties(PropertyFinder.java:55)
    at org.simpleflatmapper.reflect.meta.PropertyFinder.findProperty(PropertyFinder.java:38)
    at org.simpleflatmapper.reflect.meta.PropertyFinder.findProperty(PropertyFinder.java:33)
    at org.simpleflatmapper.map.mapper.PropertyMappingsBuilder._addProperty(PropertyMappingsBuilder.java:97)
    at org.simpleflatmapper.map.mapper.PropertyMappingsBuilder.addProperty(PropertyMappingsBuilder.java:70)
    at org.simpleflatmapper.map.mapper.DefaultConstantSourceMapperBuilder.addMapping(DefaultConstantSourceMapperBuilder.java:147)
    at org.simpleflatmapper.map.mapper.SetRowMapperBuilderImpl.addMapping(SetRowMapperBuilderImpl.java:213)
    at org.simpleflatmapper.map.mapper.MapperBuilder.addMapping(MapperBuilder.java:142)
    at org.simpleflatmapper.map.mapper.MapperBuilder.addMapping(MapperBuilder.java:152)
    at org.simpleflatmapper.jdbc.JdbcMapperFactory$SetRowMapperFactory.newInstance(JdbcMapperFactory.java:351)
    at org.simpleflatmapper.jdbc.JdbcMapperFactory$SetRowMapperFactory.newInstance(JdbcMapperFactory.java:339)
    at org.simpleflatmapper.map.mapper.DynamicSetRowMapper.getMapper(DynamicSetRowMapper.java:104)
    at org.simpleflatmapper.map.mapper.DynamicSetRowMapper.getMapperFromSet(DynamicSetRowMapper.java:94)
    at org.simpleflatmapper.map.mapper.DynamicSetRowMapper.stream(DynamicSetRowMapper.java:70)
    at org.simpleflatmapper.jdbc.JdbcMapperFactory$DynamicJdbcSetRowMapper.stream(JdbcMapperFactory.java:292)
arnaudroger commented 4 years ago

I'll check that out. looks like some generic erasure makes the call ambiguous usually can get around that by casting explictky the lamba to the targeted type.

khauser commented 4 years ago

I added #717 with what it should work with

arnaudroger commented 4 years ago

Thanks I have a bit more time at the minute, so will have try that out

arnaudroger commented 4 years ago

just pushed 8.2.3 to maven central - it should be available in the next 30 min. the test from the PR is passing with that

khauser commented 4 years ago

Thanks @arnaudroger