Java Hibernate示例查询
我将用一个例子来解释这个问题。Java Hibernate示例查询,java,hibernate,Java,Hibernate,我将用一个例子来解释这个问题。 我有一个具有型号名称和品牌的车辆对象。给出品牌时,应列出相关车辆。当给出品牌和型号时,应列出合适的车辆 例如: 有一个名为“Vehicle”的实体。它有一个名为makeModel的代理,其实体名称为makeModel。MakeModel有两个代理,分别是“make”和“model”,它们的实体名称是model和make。EntitiYes“model”和“make”都有字符串变量“name”。下面是类 class Vehicle{ private Integer
我有一个具有型号名称和品牌的车辆对象。给出品牌时,应列出相关车辆。当给出品牌和型号时,应列出合适的车辆 例如: 有一个名为“Vehicle”的实体。它有一个名为makeModel的代理,其实体名称为
makeModel
。MakeModel有两个代理,分别是“make”和“model”,它们的实体名称是model和make。EntitiYes“model”和“make”都有字符串变量“name”。下面是类
class Vehicle{
private Integer vehicleId;
private MakeModel makeMOdel;
//getters and setters
}
class MakeModel {
private Make make;
private Model model;
//getters and setters
}
class Make{
private Integer mid;
private String make;
}
class Model{
private Integer mdlid;
private String modelName;
}
下面是我如何尝试获取车辆列表的。这里,会话
是休眠会话
Criteria cr= session.createCriteria(Vehicle.class);
MakeModel mkmd=new MakeModel();
if( /* if only the make is give */){
Make mk=new Make();
mk.setMake("Toyota");
mkmd.setMake(mk);
}
else if(if both make and and model given){
Make mk=new Make();
mk.setMake("Toyota");
mkmd.setMake(mk);
Model md=new Model("Venus");
mkmd.setModel(md);
}
cr.createCriteria("makeModel").add(Example.create(mkmd));List l=cr.list();
但这会返回所有车辆。
我想让所有车辆使用hibernate标准,而不是HQL
同样的问题也可以找到并参考。任何人都可以告诉我哪里出了问题,以及如何根据给定的标准检索车辆列表。假设您正在传递函数makeValue和modelValue,它们是您想要的品牌和型号,您将有:
Criteria cr = session.createCriteria(Vehicle.class); // Create the criteria on desired class
cr.createAlis("makeModel", "makeModel")
.createAlias("makeModel.make", "make")
.createAlias("makeModel.model", "model"); // Creating aliases makes a join on those tables
if (makeValue != null){
cr.add(Restrictions.eq("make.make", makeValue)) // If you have a makeValue passed, filter by it
}
if (makeModel != null){
cr.add(Restrictions.eq("model.modelName", modelValue)); // If you have a makeModel passed, filter by it
}
return cr.list(); // Return the list
结果将是一个
列表
。您可以在方法中添加一个@SuppressWarnings(“unchecked”)
,以避免看到未经检查的强制转换警告。问题是?你提到的答案提供了一个很好的起点。你试了什么?“我不能解决这个问题”真正的意思是什么?获得一个合适的休眠标准并不是那么难,但是如果你能为车辆提供代码并生成模型实体,那就容易多了。感谢您的关注,问题已用所有代码编辑。从文档::版本属性、标识符和关联被忽略标准返回车辆列表。我刚刚把最后一条评论写错了。它给了我很长的解释(.我不是专家,也不清楚代码的这一点cr.createAlias(“makeModel”、“makeModel”)。createAlias(“make”、“make”)
设置别名“makeModel”可以,但“make”…因为车辆中没有make,只有makeModel有。但仍会引发异常。org.hibernate.QueryException:无法解析属性:make of:EntityCals.Vehicle
然后我尝试了'cr.add(Restrictions.eq(“makeModel.make”,makeValue));`直接没有别名。但是引发了另一个异常org.hibernate.QueryException:无法解析属性:makeModel.make of:EntityCls.Vehicle
我又做了一些更改。我对您为make
选择的名称感到困惑。您有类make和字段make。您应该使用类似于用于c的东西lassModel
,fieldmodelName
。请参阅我编辑的文章,也许可以尝试使用Make class
中的makeName
字段。完美!!!非常感谢。它很有效。我也从中学到了更多。:)但还有一件事。我们不能使用Hibernate.Example
做同样的事情吗?