如何避免休眠中的字符串成员?
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.firstName
returnsfirstname
必须是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 提供程序也支持它。
是否可以避免在 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.firstName
returnsfirstname
必须是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 提供程序也支持它。