Class BeanPropertyRowMapper<T>

java.lang.Object
org.springframework.data.cassandra.core.cql.BeanPropertyRowMapper<T>
Type Parameters:
T - the result type
All Implemented Interfaces:
RowMapper<T>
Direct Known Subclasses:
DataClassRowMapper

public class BeanPropertyRowMapper<T> extends Object implements RowMapper<T>
RowMapper implementation that converts a Row into a new instance of the specified mapped target class. The mapped target class must be a top-level class and it must have a default or no-arg constructor.

Column values are mapped based on matching the column name as obtained from result set meta-data to public setters for the corresponding properties. The names are matched either directly or by transforming a name separating the parts with underscores to the same name using "camel" case.

Mapping is provided for fields in the target class for many common types, e.g.: String, boolean, Boolean, byte, Byte, short, Short, int, Integer, long, Long, float, Float, double, Double, BigDecimal, java.util.Date, etc.

To facilitate mapping between columns and fields that don't have matching names, try using column aliases in the CQL statement like "select fname as first_name from customer".

For 'null' values read from the database, we will attempt to call the setter, but in the case of Java primitives, this causes a TypeMismatchException. This class can be configured (using the primitivesDefaultedForNullValue property) to trap this exception and use the primitives default value. Be aware that if you use the values from the generated bean to update the database the primitive value will have been set to the primitive's default value instead of null.

Please note that this class is designed to provide convenience rather than high performance. For best performance, consider using a custom RowMapper implementation.

Since:
3.1
Author:
Mark Paluch
  • Field Details

    • logger

      protected final Log logger
      Logger available to subclasses.
  • Constructor Details

    • BeanPropertyRowMapper

      public BeanPropertyRowMapper()
      Create a new BeanPropertyRowMapper for bean-style configuration.
      See Also:
    • BeanPropertyRowMapper

      public BeanPropertyRowMapper(Class<T> mappedClass)
      Create a new BeanPropertyRowMapper, accepting unpopulated properties in the target bean.
      Parameters:
      mappedClass - the class that each row should be mapped to
    • BeanPropertyRowMapper

      public BeanPropertyRowMapper(Class<T> mappedClass, boolean checkFullyPopulated)
      Create a new BeanPropertyRowMapper.
      Parameters:
      mappedClass - the class that each row should be mapped to
      checkFullyPopulated - whether we're strictly validating that all bean properties have been mapped from corresponding database fields
  • Method Details

    • setMappedClass

      public void setMappedClass(Class<T> mappedClass)
      Set the class that each row should be mapped to.
    • getMappedClass

      @Nullable public final Class<T> getMappedClass()
      Get the class that we are mapping to.
    • setCheckFullyPopulated

      public void setCheckFullyPopulated(boolean checkFullyPopulated)
      Set whether we're strictly validating that all bean properties have been mapped from corresponding database fields.

      Default is false, accepting unpopulated properties in the target bean.

    • isCheckFullyPopulated

      public boolean isCheckFullyPopulated()
      Return whether we're strictly validating that all bean properties have been mapped from corresponding database fields.
    • setPrimitivesDefaultedForNullValue

      public void setPrimitivesDefaultedForNullValue(boolean primitivesDefaultedForNullValue)
      Set whether we're defaulting Java primitives in the case of mapping a null value from corresponding database fields.

      Default is false, throwing an exception when nulls are mapped to Java primitives.

    • isPrimitivesDefaultedForNullValue

      public boolean isPrimitivesDefaultedForNullValue()
      Return whether we're defaulting Java primitives in the case of mapping a null value from corresponding database fields.
    • setConversionService

      public void setConversionService(@Nullable ConversionService conversionService)
      Set a ConversionService for binding Cassandra values to bean properties, or null for none.

      Default is a DefaultConversionService. This provides support for java.time conversion and other special types.

      See Also:
    • getConversionService

      @Nullable public ConversionService getConversionService()
      Return a ConversionService for binding Cassandra values to bean properties, or null if none.
    • initialize

      protected void initialize(Class<T> mappedClass)
      Initialize the mapping meta-data for the given class.
      Parameters:
      mappedClass - the mapped class
    • underscoreName

      protected String underscoreName(String name)
      Convert a name in camelCase to an underscored name in lower case. Any upper case letters are converted to lower case with a preceding underscore.
      Parameters:
      name - the original name
      Returns:
      the converted name
      See Also:
    • lowerCaseName

      protected String lowerCaseName(String name)
      Convert the given name to lower case. By default, conversions will happen within the US locale.
      Parameters:
      name - the original name
      Returns:
      the converted name
    • mapRow

      public T mapRow(com.datastax.oss.driver.api.core.cql.Row row, int rowNumber)
      Extract the values for all columns in the current row.

      Utilizes public setters and result set meta-data.

      Specified by:
      mapRow in interface RowMapper<T>
      Parameters:
      row - the Row to map, must not be null.
      rowNumber - the number of the current row.
      Returns:
      the result object for the current row.
    • constructMappedInstance

      protected T constructMappedInstance(com.datastax.oss.driver.api.core.cql.Row row, TypeConverter tc)
      Construct an instance of the mapped class for the current row.
      Parameters:
      row - the row to map (pre-initialized for the current row)
      tc - a TypeConverter with this RowMapper's conversion service
      Returns:
      a corresponding instance of the mapped class
    • initBeanWrapper

      protected void initBeanWrapper(BeanWrapper bw)
      Initialize the given BeanWrapper to be used for row mapping. To be called for each row.

      The default implementation applies the configured ConversionService, if any. Can be overridden in subclasses.

      Parameters:
      bw - the BeanWrapper to initialize
      See Also:
    • getColumnValue

      @Nullable protected Object getColumnValue(com.datastax.oss.driver.api.core.cql.Row row, int index, PropertyDescriptor pd)
      Retrieve a Cassandra object value for the specified column.

      The default implementation delegates to GettableByIndex.get(int, Class).

      Parameters:
      row - is the row holding the data
      index - is the column index
      pd - the bean property that each result object is expected to match
      Returns:
      the Object value
      See Also:
    • getColumnValue

      @Nullable protected Object getColumnValue(com.datastax.oss.driver.api.core.cql.Row row, int index, Class<?> paramType)
      Retrieve a Cassandra object value for the specified column.

      The default implementation calls GettableByIndex.get(int, Class). Subclasses may override this to check specific value types upfront, or to post-process values return from get.

      Parameters:
      row - is the row holding the data.
      index - is the column index.
      paramType - the target parameter type.
      Returns:
      the Object value.
    • newInstance

      public static <T> BeanPropertyRowMapper<T> newInstance(Class<T> mappedClass)
      Static factory method to create a new BeanPropertyRowMapper.
      Parameters:
      mappedClass - the class that each row should be mapped to.
      See Also:
    • newInstance

      public static <T> BeanPropertyRowMapper<T> newInstance(Class<T> mappedClass, @Nullable ConversionService conversionService)
      Static factory method to create a new BeanPropertyRowMapper.
      Parameters:
      mappedClass - the class that each row should be mapped to.
      conversionService - the ConversionService for binding Cassandra values to bean properties, or null for none.
      See Also: