如何避免休眠中的字符串成员?

How to avoid string members in hibernate?

是否可以避免在 Hibernate 中使用字符串文字,例如在标准限制和预测中:

Criteria criteria = session.createCriteria(Employee.class)
                   .add(Restrictions.eq("name", "john doe"));

Projection p1 = Projection.property("name");

例如,在上面的代码片段中,将 "name" 替换为 something.name ,其中 something 包含员工 class 的所有成员。

它会减少错误的发生,例如字符串中的错字。

编辑:将问题更新为更笼统而不是特定于标准。

在您的情况下,您可以使用示例查询:

Employee employee = new Employee();
employee.setName("john doe");
Example employeeExample = Example.create(employee);

Criteria criteria = session.createCriteria(Employee.class).add(employeeExample);

您可以创建员工常量class:

public class EmployeeConstants {
        public static final String firstName= "firstname";
        public static final String lastName= "lastname";
        ....
}

并将字段命名为:

Criteria criteria = session.createCriteria(Employee.class)
                   .add(Restrictions.eq(EmployeeConstants.firstName, "john doe"));

事实上EmployeeConstants.firstNamereturnsfirstname必须是Employee实体的字段名。

您可以打开 JPA 的元模型生成并使用生成的 类' 字段作为类型和名称 - 安全 "literals" 和标准 API。 来自 Hibernate docs

的示例
@Entity
public class Order {
    @Id
    @GeneratedValue
    Integer id;

    @ManyToOne
    Customer customer;

    @OneToMany
    Set<Item> items;
    BigDecimal totalCost;
    // standard setter/getter methods
}

@StaticMetamodel(Order.class) // <<<<<<<<<< this class gets generated for you
public class Order_ {
    public static volatile SingularAttribute<Order, Integer> id;
    public static volatile SingularAttribute<Order, Customer> customer;
    public static volatile SetAttribute<Order, Item> items;
    public static volatile SingularAttribute<Order, BigDecimal> totalCost;
}
// type-safe and typo-proof building of query:
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);

在大型实体和复杂查询的情况下非常方便。唯一的缺点是有时使用起来会变得非常冗长。
而且它是 JPA 标准,因此 EclipseLink 和其他 JPA 提供程序也支持它。