SQL Server Exception: "The column name xxx is not valid" when using JDBC

Problem solved. It was a simple mistake by me.

My query was using an 'AS' clause in the select statement. I was trying to retrieve the column value from the ResultSet using the actual column name, instead of the column alias defined in the AS clause.

Schoolboy error. Apologies for the time wasting.

Many thanks to Steve B. for his suggestion to use ResultSet.getColumnNames(). Although the actual method call I used was ResultSet.getMetaData().getColumnName(columnIndex);


Check the case of your table name. if collation is set to case sensitive on ms sql server the table names are affected too.


The same issue can be thrown, if the Entity & SELECT statement values are mismatching.

Check the following example:

Entity

@Setter
@Getter
@NoArgsConstructor
@Entity
@Table(name = "country")
public class Country {

    @Id
    private Integer id;
    
    private String name;

    private String code;

}

Repository

public interface CountryRepository extends JpaRepository<Country, Integer> {

    @Query(nativeQuery = true, value = "SELECT id, name FROM country WHERE isActive = 'true' ORDER BY name")
    List<Country> findIdAndNameAndCodeByIsActiveTrue();
}

In this case it will throw an Exception

com.microsoft.sqlserver.jdbc.SQLServerException: The column name code is not valid.

So, if you are NOT using * in the SELECT statement, then better to use Projections.

Hope this helps who was using frameworks.