hibernate - 我们可以像某些属性文件一样在一个地方定义所有命名查询,而不是写在实体类中吗?

标签 hibernate jpa named-query

如何定义 所有命名查询 一处 (像类)而不是写 命名查询 在顶部 实体类。

例如,我有一个基类。在这个类中,我可以定义所有命名查询。

基础程序

@Entity
@NamedQueries({
    @NamedQuery(name="Student.findAll", query="SELECT s FROM Student s"),
    @NamedQuery(name="Employee.findAll", query="SELECT e FROM Employee e")})    
class Base {

}

假设现在我有两个实体,如学生和员工。现在我想从基类访问命名查询。是可以访问的。如果可能,那么如何。
class Employee {

}

class Student {

}

在员工类中,学生我想从基类访问命名查询。有可能的。如果可能的话,我如何访问。

最佳答案

我们在一个项目上做了类似的事情。我们有一个包含我们所有命名查询的实体,并且(正如@jimfromsa 已经说过的)您的代码可以在任何需要它们的地方访问它们,因为您使用它们的唯一名称来调用它们。

@Entity
@NamedQueries({
    @NamedQuery(name="Student.findAll", query="SELECT s FROM Student s"),
    @NamedQuery(name="Employee.findAll", query="SELECT e FROM Employee e"), 
    ...
    @NamedQuery(name="SomeEntity.someQuery", query="SELECT se FROM SomeEntity se")
})
public class NamedQueryHolder implements Serializable {
    // entity needs to have an id
    @Id
    private Integer id;

    // getter and setter for id
}

请注意,此实体不需要映射到现有表,只要您不在代码中的任何地方使用它。至少这种方法适用于 EclipseLink,从未在 Hibernate 中尝试过。

在你的情况下,如果你不想要这个额外的查询持有者实体,你可以把所有命名的查询放在 Base 中。类,它会起作用。但是,我认为从实体类访问命名查询不是一个好主意,它们被称为 POJO 是有原因的。再说一次,这完全是设计问题(看看 Anemic Domain Model )。

关于hibernate - 我们可以像某些属性文件一样在一个地方定义所有命名查询,而不是写在实体类中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26838032/

相关文章:

java - 无法使用 Hibernate 检索 Oracle 中最后插入的行的 id

java - Hibernate @Id 通过继承

java - 使用 JPA 和 MySQL 检查用户是否喜欢该帖子的最佳方法是什么?

java - 加入@NamedQuery : Unexpected token ON

java - 尝试将 UUID 属性(外键)转换为实体对象时出现异常

java - ddl-auto update 创建了意外的表

java - eclipse Spring MVC 4 +Hibernate 和 MySQL + Tiles.xml 中的 HTTP 状态 404

java - 为 JPA/Hibernate 提供您自己的提供程序类

mysql - 如何在 JPA/Hibernate @NamedNativeQuery 和 Spring Data 中使用 "like"谓词和 "%"

hibernate - Grails在命名查询中使用继承的属性