相关疑难解决方法(0)

JPA一对多过滤

我们正在筑巢几个实体.但是在检索时我们只想获得那些活跃的实体.

@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方法来解决这个问题?

java jpa one-to-many

15
推荐指数
2
解决办法
2万
查看次数

@Where子句在休眠联接查询中不起作用

我有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)

java sql spring hibernate hibernate-annotations

4
推荐指数
2
解决办法
3960
查看次数

如何用硬编码值替换@JoinColumn?

有关更多上下文,请参阅我的其他问题

我想将我的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 …

java jpa

0
推荐指数
1
解决办法
3587
查看次数

标签 统计

java ×3

jpa ×2

hibernate ×1

hibernate-annotations ×1

one-to-many ×1

spring ×1

sql ×1