我正在一个相当复杂的项目中工作,该项目接收一个表名和一个列列表(以及可选的联接和其他有趣的东西)“多部分标识符……无法绑定。”我在Java 1.7上运行,带有Spring 4.3.18.RELEASE和Hibernate 5.10,连接到MS SQLServer数据库(我认为版本为12)。我写了一个简单的方法来解决这个问题:
@Transactional(propagation = Propagation.MANDATORY)
public List<Object[]> testQuery() {
Class<?> rootClass = getEntityClassByTable("pm_project");
Session session = entityManager.unwrap(Session.class);
Criteria crit = session.createCriteria(rootClass);
List<String> columnList = new ArrayList<>();
columnList.add("pm_project.pm_project_id");
columnList.add("pm_project.pm_project_name");
columnList.add("pm_project.pm_project_title");
columnList.add("pm_project.parent_id");
columnList.add("pm_project.pm_project_from_date");
ProjectionList projList = Projections.projectionList();
for (String column : columnList) {
String[] columnAliases = new String[0];
Type[] types = new Type[1];
types[0] = StringType.INSTANCE;
projList.add(Projections.sqlProjection(column, columnAliases, types));
}
crit.setProjection(projList);
List<Object[]> results = crit.list();
return results;
}
'getEntityClassByTable'获取具有指定名称的表的实体类。
在Hibernate内部,将生成此sql:
select pm_project.pm_project_id, pm_project.pm_project_name, pm_project.pm_project_title, pm_project.parent_id, pm_project.pm_project_from_date from pm_project this_
由于结尾处的“ this_”,这也打破了休眠状态。因为列名指定了它们来自的表(即使只有一个表),所以系统感到困惑,因为它给表赋予了自己的别名,而我得到了这个错误。我需要一个可以接受此处介绍的字符串的解决方案,因为它们来自我无法接触的旧系统(基本上,该公司早在2001年就创建了自己的专有持久性系统)。我可以仅将表名指定为其自身的别名吗?还是我应该离开桌子加入一些东西?
(此外,任何最佳做法的建议都将受到赞赏)