Reputation: 7882
I'm getting a strange error from the SQL Server JDBC driver. It is telling me that a column name is invalid even though the column is present, correctly named and the same query works fine when executed in SqlServer Management Studio.
The error is:
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The column name MarginCall is not valid.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:170)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.findColumn(SQLServerResultSet.java:626)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getBigDecimal(SQLServerResultSet.java:2570)
at org.apache.commons.dbcp.DelegatingResultSet.getBigDecimal(DelegatingResultSet.java:305)
...
Upvotes: 14
Views: 33248
Reputation: 832
The same issue can be thrown, if the Entity
properties & SELECT
statement column 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 do not need all the columns as response, then use Projections as return type or mention all the columns which are available as part of entity
in the select
query.
Upvotes: 1
Reputation: 7882
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);
Upvotes: 17
Reputation: 5853
Check the case of your table name. if collation is set to case sensitive on ms sql server the table names are affected too.
Upvotes: 1
Reputation: 11790
Try to enclose the column name inside square brackets: [MarginCall] Just a guess.
Upvotes: 0