Hsqldb 标识符上的QueryDsl列区分大小写错误

Hsqldb 标识符上的QueryDsl列区分大小写错误,hsqldb,querydsl,Hsqldb,Querydsl,我看过很多关于内存数据库(如hsqldb和h2)的列名大小写敏感度的帖子。我们使用的是sql server驼峰大小写列名。但是,我正在使用HyperSql进行测试,它对列名区分大小写。在hypersql中,我看不到任何处理列名敏感度的设置,除非在创建表时引用列名,例如,这将使它们成为引号中的任何大小写 插入AddressType(“AddressTypeName”、“CreateUser”) 值('邮寄','用户') 这将在hsqldb中创建列名为AddressTypeName和CreateUs

我看过很多关于内存数据库(如hsqldb和h2)的列名大小写敏感度的帖子。我们使用的是sql server驼峰大小写列名。但是,我正在使用HyperSql进行测试,它对列名区分大小写。在hypersql中,我看不到任何处理列名敏感度的设置,除非在创建表时引用列名,例如,这将使它们成为引号中的任何大小写 插入AddressType(“AddressTypeName”、“CreateUser”) 值('邮寄','用户')

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

sql server不愿意将其全部大写。因此,在hsqldb中创建列时,我引用了以驼峰大小写创建它们的列。除非使用Querydsl,否则它们的identiffers不会引用它们,这将导致使用大写列名进行查找,并且数据库现在将它们作为大小写

整个问题是由sql server列生成的QueryDsl Q类型具有带有引号列的元数据引起的,并且由于sql server将它们作为camel case,所以它将它们作为camel case查找。但现在,当执行Q类型查询时,它使用未加引号的标识符,这导致大写查找失败。除了让数据库将它们改为大写,并将所有Q类型改为大写,以便元数据列名查找之外,我看不到任何解决方法

我想这是querydsl中的一个bug

示例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大小写,那么queryDslTemplate调用将失败,因为它没有引用标识符。在下面的代码中,其中(qAddressType.addressTypeID.eq(id));在sql a.addressTypeID=1中执行此操作,其中a是QAddressType的别名。它必须是一个“addressTypeID”=1,否则hsqldb会将其查找为a.ADDDRESTYPEID=1

专用静态QAddressType QAddressType=新QAddressType(“a”)


在QueryDsl中,当生成Q类型时,它具有MetaDataExporter类,该类具有应用NamingStrategy的方法。在NamingStrategy中,我发现了这个方法:normalizeColumnName String normalizeColumnName(String columnName),它有以下Javadoc:转换给定的列名并提供添加带引号的标识符的机会我相信我想添加带引号的标识符来纠正我的问题。问题是我无法找到任何关于如何实现这一点的文档。如果有人知道这是怎么做到的,让我知道。我找到了一个工作,我一直在使用。我切换到H2数据库,因为它有一个使列查询不区分大小写的标志。例如:数据库URL的IGNORECASE=TRUE(例如:jdbc:h2:~/test;IGNORECASE=TRUE)。这解决了我的问题。在QueryDsl中,当生成Q类型时,它有一个MetaDataExporter类,它有一个应用NamingStrategy的方法。在NamingStrategy中,我发现了这个方法:normalizeColumnName String normalizeColumnName(String columnName),它有以下Javadoc:转换给定的列名并提供添加带引号的标识符的机会我相信我想添加带引号的标识符来纠正我的问题。问题是我无法找到任何关于如何实现这一点的文档。如果有人知道这是怎么做到的,让我知道。我找到了一个工作,我一直在使用。我切换到H2数据库,因为它有一个使列查询不区分大小写的标志。例如:数据库URL的IGNORECASE=TRUE(例如:jdbc:h2:~/test;IGNORECASE=TRUE)。这解决了我的问题。
@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;
}