我在hsqldb和h2这样的内存数据库中看到很多关于列名称区分大小写的帖子 . 我们使用的是sql server camel case列名 . 但是,我正在测试使用HyperSql,这是列名称区分大小写 . 我没有看到任何设置来处理hypersql中的列名敏感性,除非在创建表时引用列名,这将使它们成为引号内的情况,例如Insert Into AddressType(“AddressTypeName”,“CreateUser”)值('邮寄','用户')

这将在hsqldb中创建具有列名AddressTypeName和CreateUser的表

sql server不愿意将它们全部置于大写 . 因此,在hsqldb中创建列时,我引用它们以驼峰形式创建它们 . 工作得很好除非使用Querydsl时它们的标识符不引用它们然后导致使用大写列名称查找,数据库现在将它们作为驼峰大小写 .

整个问题的开始是因为从sql server列生成的QueryDsl Q类型具有带引号列的元数据,并且因为sql server将它们作为camel case将它们视为camel case . 但现在在进行Q类型查询时,它使用未引用的标识符,这导致大写查找失败 . 我没有看到任何解决方法,除了让数据库使它们成为大写并且将所有Q类型更改为元数据列名称查找的大写 .

我认为这是querydsl中的一个错误 .

示例QAddressType addMetadata . 请注意ColumnMetadata.named(“AddressTypeName”)通过引用这些数据库,数据库必须以camel为例 .

public void addMetadata() {
        addMetadata(addressTypeID, ColumnMetadata.named("AddressTypeID").withIndex(1).ofType(Types.BIGINT).withSize(19).notNull());
        addMetadata(addressTypeName, ColumnMetadata.named("AddressTypeName").withIndex(2).ofType(Types.VARCHAR).withSize(50).notNull());
ColumnMetadata.named("CreateUser").withIndex(3).ofType(Types.VARCHAR).withSize(100).notNull());
    }

但是,如果我将数据库切换为camel case,则queryDslTemplate调用将失败,因为它不引用标识符 . 所以在下面的代码.where(qAddressType.addressTypeID.eq(id));在sql中执行此操作a.addressTypeID = 1其中a是QAddressType的别名 . 它必须是a . “addressTypeID”= 1,否则hsqldb将其查找为a.ADDDRESTYPEID = 1

private static QAddressType qAddressType = new QAddressType(“a”);

@Override
public AddressType getById(Long id) {
AddressType addressType = null;
try {
SQLQuery sqlQuery = queryDslJdbcTemplate.newSqlQuery()
.from(qAddressType)
.where(qAddressType.addressTypeID.eq(id));
addressType = queryDslJdbcTemplate.queryForObject(sqlQuery, new AddressTypeProjection(qAddressType));
//the API was not throwing the Exception so let's explicitly throw it 
return addressType;
}