目前我正在努力只能获取我需要的数据.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的新手,我正在尝试使用实体图.我意识到当我检索数据时,我需要指定我想要使用的EntityGraphType.
我阅读了JPA2.1规范,但我仍然不确定如何才能正确使用这两个选项...
问题是...
给定以下域模型,我想加载所有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。
这是我的实体:
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提供程序.
在 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也可以吗?
谢谢,
加布里埃尔
我将我的应用程序从 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) 所以我找到了一些答案,一个说可以这样做,另一个说不行。这让我很困惑,因为当我尝试这样做时——我失败了。
我想要的是在子图中引用命名实体图,如下所示:
@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) 我使用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中实现呢?
我想在 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 + 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
entitygraph ×10
java ×7
jpa ×7
hibernate ×4
spring ×2
spring-data ×2
criteria-api ×1
eclipselink ×1
fetch ×1
openjpa ×1
orm ×1
postgresql ×1
spring-boot ×1