es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Spring boot con consulta nativa – la entidad mapeada es nula cuando el valor de la columna es nulo.

Estoy usando una consulta nativa para obtener una lista de entidades en Spring Boot. Cada vez que el valor de la columna es nulo, la entidad asignada también es nula. Mi repositorio se ve así:

“`
@Repository
public interface OrderRepository extends CrudRepository<OrderKey, Long> {

@Query(value = "SELECT l.[ORDER_ID]," +
"l.[KEY_TYPE], " +
"l.[KEY]," +
"l.[VERSION] " +
"FROM [ORDER_TABLE] l " +
"WHERE [ORDER_ID] = :orderId",
nativeQuery = true)
List<OrderKey> findAll(@Param("orderId") Long orderId);
}

Entidad:

public class OrderKey implements Serializable {

private static final long serialVersionUID = 10L;

@Id
@Column(name = "ORDER_ID")
public long orderId;

@Id
@Column(name = "KEY_TYPE")
public String keyType;

@Column(name = "KEY")
public String key;

@Column(name = "VERSION")
public String version;
}

Tengo tres filas en la tabla de la base de datos, donde dos filas tienen la columna “Versión” con valores nulos.

Veo que la lista poblada tiene: {nulo, nulo, instancia de OrderKey}

¿Puede alguien ayudarme a solucionar esto?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para solucionar este problema, se puede utilizar la anotación @SqlResultSetMapping.

    Primero, es necesario crear un constructor en la clase OrderKey que tome todas las columnas seleccionadas en la consulta.

    public OrderKey(long orderId, String keyType, String key, String version) {
        this.orderId = orderId;
        this.keyType = keyType;
        this.key = key;
        this.version = version;
    }
    

    Luego, se puede crear un @SqlResultSetMapping que especifique el constructor a usar para crear instancias de OrderKey.

    @SqlResultSetMapping(
            name = "OrderKeyMapping",
            classes = {
                    @ConstructorResult(
                            targetClass = OrderKey.class,
                            columns = {
                                    @ColumnResult(name = "ORDER_ID", type = Long.class),
                                    @ColumnResult(name = "KEY_TYPE"),
                                    @ColumnResult(name = "KEY"),
                                    @ColumnResult(name = "VERSION")
                            }
                    )
            }
    )
    

    Finalmente, se puede modificar el método findAll para usar SqlResultSetMapping.

    @Repository
    public interface OrderRepository extends CrudRepository<orderkey, long=""> {
    
        @Query(value = "SELECT l.[ORDER_ID], " +
                "l.[KEY_TYPE], " +
                "l.[KEY], " +
                "l.[VERSION] " +
                "FROM [ORDER_TABLE] l " +
                "WHERE [ORDER_ID] = :orderId",
                nativeQuery = true,
                resultSetMapping = "OrderKeyMapping")
        List<orderkey> findAll(@Param("orderId") Long orderId);
    
    }
    

    Ahora, cuando se llama a este método para filas donde la columna version es nula, la lista resultante de OrderKey tendrá instancias de OrderKey con el campo version establecido en nulo en lugar de instancias nulas.</orderkey,>

Comments are closed.