0

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

例如检索一个对象..

    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”或“name”或“weight”,推荐的问题解决方案是什么?

4

1 回答 1

2

第一个解决方案:使用常量将它们硬编码在一个地方。但是这个解决方案很糟糕,因为您的代码将变得不那么可读,并且您仍然有在常量中包含不正确列名的风险。

第二种解决方案:保持原样,对您的查询进行单元测试。代码将保持可读性,并且您的单元测试将确保您没有错误的名称。

第三种解决方案:使用 JPA API,并使用 JPA2 标准 API,以及自动生成的 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 更具可读性。无论如何,您都需要对查询进行单元测试。所以这些测试将检查属性名称是否正确。

于 2012-08-10T07:24:31.660 回答