建议的方法来检索实体的属性名称?

时间:2012-08-10 06:52:22

标签: hibernate

我可以知道检索实体属性名称的推荐方法是什么

例如检索一个对象..

    Product product =  criteria.add(Restrictions.eq("productID",productId))
.uniqueResult();

List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .add( Restrictions.between("weight", minWeight, maxWeight) )
    .list();

...

但我不想硬编码“productID”或“名称”或“重量”,建议解决问题的方法是什么?

1 个答案:

答案 0 :(得分:2)

第一个解决方案:使用常量在一个地方对它们进行硬编码。但是这个解决方案很糟糕,因为你的代码可读性会降低,你仍然有可能在常量中有不正确的列名。

第二个解决方案:保持原样,并对您的查询进行单元测试。代码将保持可读性,您的单元测试将确保您的名称不正确。

第三种解决方案:使用JPA API,并使用JPA2条件API和automatically generated metamodel。然后查询将如下所示:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Order> cq = cb.createQuery(Order.class);
SetJoin<Order, Item> itemNode = cq.from(Order.class).join(Order_.items);
cq.where( cb.equal(itemNode.get(Item_.id), 5 ) ).distinct(true);

Order_Item_是自动生成的元模型类,分别为OrderItem实体的每一列和关联保存属性。请注意,恕我直言,JPA2标准API是一种非直观,难以使用的API,不会使代码具有可读性。

无论如何,每次都可以使用HQL / JPQL代替标准查询:它们更易读恕我直言。当查询必须基于各种可选标准动态生成时,或者当您有大量复杂的类似查询并且可以重用公共部分时,条件查询很有用。但对于大多数情况,HQL更具可读性。无论如何,您需要对查询进行单元测试。因此,这些测试将检查属性名称是否正确。