我有一个包含大约800个查询的HQL查询文件。在运行时检测到执行的查询和从浏览器传递的争论被映射,默认情况下我的代码将从浏览器传递的参数转换为Long。问题在于某些bean类中的变量(即比较的左侧)是int而在某些情况很长。但是在运行时我无法想出任何方法来检测"类型"比较论证的左侧。
说:从员工e中选择*,其中e.id = $ empid $
$ empid $被替换为运行时从浏览器传递的值,默认情况下,我的代码将传递的值强制转换为Long。如果e.id是int,那么这将抛出ClassCastException。是否有任何方法可以在运行时检测e.id的类型。或任何其他想法来解决这个问题。
我尝试将RHS转换为数字,但它对我有用。任何建议都会非常受欢迎。感谢
答案 0 :(得分:2)
首先,您需要访问ClassMetadata:
ClassMetadata metadata=sessionFactory.getClassMetadata(Employee.class);
您可以按如下方式编写HQL查询:
Number id = ...;
Type identifierType = metadata.getIdentifierType();
Class identifierClass = identifierType.getReturnedClass();
if(Long.class.equals(identifierClass)) {
id = id.longValue();
} else {
id = id.intValue();
}
session.createQuery("select e from Employee e where e.id = :id")
.setParameter("id", id, identifierType)
.list();
提供实际类型应解决您的问题。