【发布时间】:2014-07-25 12:31:01
【问题描述】:
我正在为 Mybatis DB 映射器构建动态查询,以访问 MySql 数据库。查询由包含选择字段的 XML 配置文件驱动。所以我动态地创建了一个标准对象。 我的问题是,如果选择字段之一是字符串,则选择返回不需要的记录,因为它不区分大小写
例如,如果选择值为“Analog1”,这将匹配值为“analog1”的记录。
问题是,我可以强制底层 SELECT 区分大小写吗? 我知道
select * from Label where binary Label_Name = 'analog1';
将仅匹配“analog1”而不匹配“Analog1”。但是如何告诉Mybatis查询在查询中使用二进制限定符呢?
这是我创建条件的代码。如您所见,这一切都是使用反射动态完成的,没有硬编码:
private Object findMatchingRecord(TLVMessageHandlerData data, Object databaseMapperObject, Object domainObject, ActiveRecordDataType activeRecordData)
throws TLVMessageHandlerException {
if (activeRecordData == null) {
return false;
}
String domainClassName = domainObject.getClass().getName();
try {
String exampleClassName = domainClassName + "Example";
Class<?> exampleClass = Class.forName(exampleClassName);
Object exampleObject = exampleClass.newInstance();
Method createCriteriaMethod = exampleClass.getDeclaredMethod("createCriteria", (Class<?>[])null);
Object criteriaObject = createCriteriaMethod.invoke(exampleObject, (Object[])null);
for (String selectField : activeRecordData.getSelectField()) {
String criteriaMethodName = "and" + firstCharToUpper(selectField) + "EqualTo";
Class<?> selectFieldType = domainObject.getClass().getDeclaredField(selectField).getType();
Method criteriaMethod = criteriaObject.getClass().getMethod(criteriaMethodName, selectFieldType);
Method getSelectFieldMethod = domainObject.getClass().getDeclaredMethod("get" + firstCharToUpper(selectField));
Object selectFieldValue = getSelectFieldMethod.invoke(domainObject, (Object[])null);
if (selectFieldValue != null) {
criteriaMethod.invoke(criteriaObject, new Object[] { selectFieldValue });
}
}
List<?> resultSet = tlvMessageProcessingDelegate.selectByExample(databaseMapperObject, exampleObject);
if (resultSet.size() > 0) {
return resultSet.get(0);
}
else {
return null;
}
}
catch(..... Various exceptions.....) {
}
【问题讨论】: