我们正在筑巢几个实体.但是在检索时我们只想获得那些活跃的实体.
@Entity
public class System {
@Id
@Column(name = "ID")
private Integer id;
@OneToMany(mappedBy = "system")
private Set<Systemproperty> systempropertys;
}
@Entity
public class Systemproperty {
@Id
@Column(name = "ID")
private Integer id;
@Id
@Column(name = "ACTIVE")
private Integer active;
}
Run Code Online (Sandbox Code Playgroud)
在请求时Systemproperties我只想获取属性active(active = 1).
搜索我发现了一些hibernate注释和使用子查询的可能性.然而,两者都不适合我.即使我们目前正在使用hibernate,我也在考虑用Eclipselink替换它,因为我们目前不得不使用预先加载,我们可能会遇到性能问题.子查询不能很好地工作,因为我们正在嵌套几个级别.
Eclipselink似乎有一个可以工作的@Customizer注释,但它似乎遵循与hibernate @FilterDef注释不同的概念,并且在切换时会产生额外的开销.
在@JoinColumn似乎没有允许进一步的筛选.是否有标准的JPA方法来解决这个问题?
我有2个带有@Where注释的实体。第一个是类别;
@Where(clause = "DELETED = '0'")
public class Category extends AbstractEntity
Run Code Online (Sandbox Code Playgroud)
具有以下关系:
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "category")
private Set<SubCategory> subCategories = Sets.newHashSet();
Run Code Online (Sandbox Code Playgroud)
第二个实体是SubCategory;
@Where(clause = "DELETED = '0'")
public class SubCategory extends AbstractEntity
Run Code Online (Sandbox Code Playgroud)
并包含对应关系;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CATEGORY_ID")
private Category category;
Run Code Online (Sandbox Code Playgroud)
每当我调用以下Dao方法时;
@Query(value = "select distinct category from Category category join fetch category.subCategories subcategories")
public List<Category> findAllCategories();
Run Code Online (Sandbox Code Playgroud)
我得到以下sql查询;
select
distinct category0_.id as id1_3_0_,
subcategor1_.id as id1_16_1_,
category0_.create_time as create2_3_0_,
category0_.create_user as create3_3_0_,
category0_.create_userip as …Run Code Online (Sandbox Code Playgroud) 有关更多上下文,请参阅我的其他问题。
我想将我的Employee实体类加入实体类,Code但代码 PK 是复合的(DOMAIN、CODE),因为它列出了许多不同的代码域,但进入 Employee 类/表中的代码都来自一个域,消除了需要在 Employee 类/表中有一个域字段(因为它总是相同的)。
我可以加入员工以代码通过在使用CODE字段员工表和一个硬编码值(例如EMP_TYPE),而不是冗余列?
如果我的Employee类/表确实有那个多余的列,我会像这样加入它:
@JoinColumns({
@JoinColumn(name = "EMP_TYPE_CODE", referencedColumnName = "CODE"),
@JoinColumn(name = "DOMAIN", referencedColumnName = "DOMAIN)})
@ManyToOne(optional = false)
private Code sharedStatute;
Run Code Online (Sandbox Code Playgroud)
但我真的不想在数据库和班级中有额外的列,因为它总是相同的。
我想要完成的将相当于 SQL 中的以下内容:
SELECT e.emp_id, e.first_name, e.last_name, c.description as emp_type
FROM Employee e JOIN Code c
ON e.emp_type_code = c.code
WHERE c.domain = 'EMP_TYPE'
Run Code Online (Sandbox Code Playgroud)
与domain在 Employee 表中添加一个字段并使用相同的值 ('EMP_TYPE') 填充 EVERY SINGLE RECORD …