标签: entitygraph

Spring Data JPA和NamedEntityGraphs

目前我正在努力只能获取我需要的数据.findAll()方法需要根据其被调用的位置获取数据.我不想最终为每个实体图编写不同的方法.此外,我会避免调用实体管理员并自己形成(重复)查询.基本上我想在findAll方法中使用构建,但是使用我喜欢的实体图.任何机会?

@Entity
@Table(name="complaints")
@NamedEntityGraphs({
    @NamedEntityGraph(name="allJoinsButMessages", attributeNodes = {
            @NamedAttributeNode("customer"),
            @NamedAttributeNode("handling_employee"),
            @NamedAttributeNode("genre")
    }),
    @NamedEntityGraph(name="allJoins", attributeNodes = {
            @NamedAttributeNode("customer"),
            @NamedAttributeNode("handling_employee"),
            @NamedAttributeNode("genre"),
            @NamedAttributeNode("complaintMessages")
    }),
    @NamedEntityGraph(name="noJoins", attributeNodes = {

    })
})
public class Complaint implements Serializable{
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private long id;

    private Timestamp date;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "customer")
    private User customer;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "handling_employee")
    private User handling_employee;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="genre")
    private Genre genre;

    private boolean closed;

    @OneToMany(mappedBy = "complaint", fetch = …
Run Code Online (Sandbox Code Playgroud)

jpa fetch spring-data-jpa entitygraph

47
推荐指数
4
解决办法
3万
查看次数

对于JPA的实体图,FETCH和LOAD有什么区别?

我是JPA的新手,我正在尝试使用实体图.我意识到当我检索数据时,我需要指定我想要使用的EntityGraphType.

我阅读了JPA2.1规范,但我仍然不确定如何才能正确使用这两个选项...

问题是...

  • 如果我没有任何具体要求,我应该使用哪个选项?
  • 当我需要使用Fetch和Load时,具体情况是什么?

java jpa entitygraph

25
推荐指数
1
解决办法
9819
查看次数

JPA 继承@EntityGraph 包括子类的可选关联

给定以下域模型,我想加载所有Answers,包括它们的Values 和它们各自的子子级,并将其放入 an 中AnswerDTO,然后转换为 JSON。我有一个可行的解决方案,但它遇到了 N+1 问题,我想通过使用临时@EntityGraph. 所有关联都已配置LAZY

在此处输入图片说明

@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
Run Code Online (Sandbox Code Playgroud)

@EntityGraph在该Repository方法上使用临时方法,我可以确保预取值以防止Answer->Value关联中出现 N+1 。虽然我的结果很好,但由于延迟加载s的selected关联,还有另一个 N+1 问题MCValue

使用这个

@EntityGraph(attributePaths = {"value.selected"})
Run Code Online (Sandbox Code Playgroud)

失败,因为该selected字段当然只是某些Value实体的一部分:

Unable to locate Attribute  with the the given name [selected] on this ManagedType [x.model.Value];
Run Code Online (Sandbox Code Playgroud)

我如何告诉 JPA 仅selected在值为 a 的情况下尝试获取关联MCValue?我需要类似的东西optionalAttributePaths

java postgresql hibernate jpa entitygraph

18
推荐指数
2
解决办法
2791
查看次数

Hibernate忽略了fetchgraph

这是我的实体:

public class PersonItem implements Serializable{
    @Id
    @Column(name="col1")
    private String guid;

    @Column(name="col2")
    private String name;

    @Column(name="col3")
    private String surname;

    @Column(name="col4")
    private Date birthDate;
 //+getters and setters
}
Run Code Online (Sandbox Code Playgroud)

这就是我获取人员名单的方式:

Query query = em.createQuery("Select p from PersonItem p WHERE p.guid IN (:guids)");
EntityGraph<PersonItem> eg = em.createEntityGraph(PersonItem.class);
eg.addAttributeNodes("guid");
eg.addAttributeNodes("name");
eg.addAttributeNodes("surname");
query.setHint("javax.persistence.fetchgraph", eg);
query.setParameter("guids", guids);
List<PersonItem> list=query.getResultList();
em.close();
// And now I iterate result AFTER EM CLOSE
....iterate
Run Code Online (Sandbox Code Playgroud)

如果我理解了fetch图,它必须只加载我指定的那些字段.但是,字段"birthDate"也被加载.除了我看到在hibernate sql查询4列被选中.

怎么解决?我使用hibernate 5.1.0作为JPA提供程序.

java hibernate jpa entitygraph

8
推荐指数
1
解决办法
1560
查看次数

Spring Data JPA findAll 与不同的EntityGraph

在 Spring Data JPA 存储库中,我需要指定多个方法来执行相同的操作(例如 findAll),但指定不同的 @EntityGraph 注释(目标是在不同的服务中使用优化的方法)。

Es。

@Repository
public interface UserRepository extends JpaSpecificationExecutor<User>, JpaRepository<User, Long> {

@EntityGraph(attributePaths = { "roles" })
findAll[withRoles](Specification sp);

@EntityGraph(attributePaths = { "groups" })
findAll[withGroups](Specification sp);

etc...
}
Run Code Online (Sandbox Code Playgroud)

在Java中我们不能多次使用同一个方法,那么如何管理它呢?

不使用JPQL也可以吗?

谢谢,

加布里埃尔

java spring spring-data spring-data-jpa entitygraph

8
推荐指数
1
解决办法
3702
查看次数

Spring data JPA - 使用@EntityGraph 导致“指定的实体图不适用于实体”警告

我将我的应用程序从 spring boot 2.2.5 升级到 2.3.3,并且我正在使用带有 5.4.20.Final 板载的 spring data JPA starter。我的实体在编译时得到增强。

现在,当我在覆盖方法上使用@EntityGraph带有attributePaths属性的注释时,我收到此警告:findAllJpaRepository

2020-08-19 12:13:41.121  WARN 9348 --- [nio-8060-exec-3] [] [] o.h.engine.internal.TwoPhaseLoad         : Entity graph specified is not applicable to the entity [DictionaryLang(id=1601, name=null, lang=null)]. Ignored.
2020-08-19 12:13:41.483  WARN 9348 --- [nio-8060-exec-3] [] [] o.h.engine.internal.TwoPhaseLoad         : Entity graph specified is not applicable to the entity [DictionaryValueLang(id=3051, lang=null, name=null)]. Ignored.
Run Code Online (Sandbox Code Playgroud)

即使此警告 - 图形已正确获取 - 我只能在日志中看到一个 SQL 查询,并且应用程序的行为与更新前一样。

这是我的存储库代码:

public interface DictionaryRepository extends JpaRepository<Dictionary, Long>, QuerydslPredicateExecutor<Dictionary> …
Run Code Online (Sandbox Code Playgroud)

java hibernate spring-data-jpa spring-boot entitygraph

8
推荐指数
1
解决办法
2608
查看次数

子图可以引用另一个命名实体图吗?

所以我找到了一些答案,一个说可以这样做,另一个说不行。这让我很困惑,因为当我尝试这样做时——我失败了。

我想要的是在子图中引用命名实体图,如下所示:

@Entity
@Table(name = "parent")
@NamedEntityGraphs({
    @NamedEntityGraph(
        name = "Parent.all",
        attributeNodes = {
            @NamedAttributeNode(value = "child", subgraph = "Child.all"), // here I am referencing graph specified in Child entity
        }
    )
})
public class ParentModel {

  @OneToOne(
      mappedBy = "parent",
      fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
  private ChildModel child;

}
Run Code Online (Sandbox Code Playgroud)
@Entity
@Table(name = "child")
@NamedEntityGraphs({
    @NamedEntityGraph(
        name = "Child.all",
        attributeNodes = {
            @NamedAttributeNode(value = "grandChildren"),
        }
    )
})
public class ChildModel {

  @OneToOne(fetch = FetchType.LAZY)
  @JoinColumn(name …
Run Code Online (Sandbox Code Playgroud)

java hibernate jpa spring-data entitygraph

7
推荐指数
1
解决办法
1292
查看次数

如何使用JPA获取整个实体图

我使用JPA 2.0和OpenJPA作为底层实现.我有一个映射到自身的实体来表示实体之间的父子层次结构.一个实体最多可以有一个以上的子女,但只有一个父母.因此,没有父级的实体位于层次结构的顶层.我的目标是从数据表中获取所有层次结构.所以我的查询为:

SELECT e FROM MyEntity e where e.parent is null
Run Code Online (Sandbox Code Playgroud)

在MyEntity中,我完成了映射:

@ManyToOne
@JoinColumn(name="PARENT")
private MyEntity parent;

@OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
private List<MyEntity> children;
Run Code Online (Sandbox Code Playgroud)

当程序运行时,层次结构顶部的实体将填充其所有子项,但子实体不会获取其子项.我认为EAGER提取将填充整个实体图.但事实并非如此.在JPA 2.1中有EntityGraph ASAIK的功能.但是如何在JPA 2.0中实现呢?

java orm jpa openjpa entitygraph

6
推荐指数
1
解决办法
2333
查看次数

EntityGraph - 您必须在描述符中定义一个提取组管理器,以便在查询上设置一个提取组

我想在 EclipseLink 和 GlassFish 中使用实体图。

    @Entity
    @NamedQueries({
         @NamedQuery(name = "invoice.all", query = "SELECT i FROM Invoice i")})


    @NamedEntityGraph(name = "graph.invoice",
                attributeNodes = {@NamedAttributeNode("invoiceNum")})

    @Table(name = "INVOICE")
    public class Invoice implements Serializable {
            private int id;
            private String bizonylatSzam;
            ...
        }

EntityManager em = getEntityManagerFactory().createEntityManager();
EntityGraph eg = em.createEntityGraph("graph.invoice");
List<Invoice> invoiceList =  em.createNamedQuery("invoice.all").setHint("javax.persistence.fetchgraph", eg).getResultList();
Run Code Online (Sandbox Code Playgroud)

如果我使用javax.persistence.loadgraph图形一切正常,但如果我使用javax.persistence.fetchgraph我有一个例外:

org.eclipse.persistence.exceptions.QueryException 异常说明:您必须在描述符 (Invoice) 中定义一个提取组管理器,以便在查询 (invoice.all) 上设置提取组

在 EclipseLink 网页中写:

... 使用编织技术..

Weaving 和 Java EE 应用服务器

默认的 EclipseLink 编织行为适用于使用 EclipseLink JPA 持久性提供程序的任何符合 …

jpa eclipselink entitygraph

6
推荐指数
0
解决办法
875
查看次数

使用带有 ResultTransformer 的 DTO 投影的实体图返回空值

你好,我是 jpa + criteria API + hibernate 的新手。

我对 jpa 标准 API 中 ResultTransformer 的使用存有疑问。

我有两个实体“部门”和“员工”。部门和员工之间的一对多映射。我想使用带有 DTO 投影的实体图

1. 部门

@Entity
@NamedEntityGraph(name = "departmentWithEmployee", attributeNodes = @NamedAttributeNode("setOfEmployee"))
@Table(name = "tblDepartment")
public class Department {

    @Id
    private String id;

    private String name;

    @OneToMany(mappedBy = "department")
    private Set<Employee> setOfEmployee;

    //....getter & setter

}
Run Code Online (Sandbox Code Playgroud)

2. 员工

@Entity
@Table(name = "tblEmployee")
public class Employee {

    @Id
    private String id;

    @ManyToOne
    @JsonIgnore
    private Department department;

    private String firstName;

    private String lastName;

    //...getter & setter

} …
Run Code Online (Sandbox Code Playgroud)

spring resulttransformer criteria-api spring-data-jpa entitygraph

6
推荐指数
0
解决办法
1624
查看次数