【发布时间】:2014-09-16 00:22:31
【问题描述】:
我有一个具有 70 个属性的对象。为了便于使用,我创建了 2 个对象,一个“主要”对象和一个“详细信息”对象,基于自动生成的整数 ID 具有 1:1 的关系。我有一个 SEARCH 屏幕,允许搜索任何主要属性,为此我为用户输入的任何内容构建 Restriction 对象。很好的是,我通过遍历字段和构建标准来完成这一切 - 我没有需要丑陋的代码来专门处理 30 个属性中的每一个。
现在他们也想搜索详细信息字段。我以前的屏幕字段迭代代码在没有任何更改的情况下完美运行(使其成为“通用”的全部原因),但是我无法让 JOIN 工作以查询详细信息字段。
class House {
Integer houseID;
String address;
. . .
HouseDetails houseDetails;
}
class HouseDetails {
Integer houseID;
String color;
. . .
}
我尝试创建一个别名并将其添加到条件中:
criteria.createAlias("houseDetails", "houseDetails");
但我收到此错误:
org.hibernate.QueryException: could not resolve property: color of: House
事情是这样的——我知道如果我在我的限制前面加上别名,这会起作用,但我不想知道该字段来自哪个表(House 或 HouseDetails)。这将破坏所有自动循环代码并为每个字段创建特定代码。
因为只要列名是唯一的,SQL 就可以做到这一点:
select * from house, housedetails where house.houseID = housedetails.houseID
and color = 'blue';
我想知道如何使用标准使其工作?
顺便说一句,但与此相关:有没有一种方法可以执行 Java 对 Hibernate HBM.XML 映射文件的自省之类的操作?很多次我都想这样做来解决问题,但从未找到答案。对于上述问题,如果我可以很容易地找出每个字段包含在哪个表中,我可以在 Restriction 中添加前缀。像这样:
// Map of search keys (columns) to searching values
for ( String key : parms.keySet() ) {
String val = parms.get(key);
if ( HIBERNATE-SAYS-KEY-IS-FROM-DETAILS-TABLE ) {
key = "houseDetails." + key;
}
criteria.add(Restrictions.eq(key,val));
}
【问题讨论】:
-
有什么更新吗?......
标签: java mysql sql hibernate hibernate-criteria