我正在使用JPA 2.1和Hibernate进行实现。
举一个示例:
我有一个父实体(称之为Parent)和一个子实体(称之为Child)。
UniqueKey Embeddable:
<link rel="stylesheet" type="text/css" href="https://cdn.rawgit.com/jtblin/angular-chart.js/0.8.0/dist/angular-chart.css">
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.0-rc.0/angular.min.js"></script>
<script src="https://rawgit.com/nnnick/Chart.js/v1.0.2/Chart.min.js"></script>
<script src="https://rawgit.com/jtblin/angular-chart.js/0.8.0/dist/angular-chart.min.js"></script>
<!--
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.3.0/Chart.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-chart.js/1.0.3/angular-chart.min.js"></script>
-->
<body ng-app="myApp" ng-controller="myController as ctrl">
<canvas id="pie" class="chart chart-pie" chart-data="ctrl.data" chart-labels="ctrl.labels" chart-options="ctrl.options">
</canvas>
</body>
家长实体:
@Embeddable
@EqualsAndHashCode
@Data
@NoArgsConstructor
public class UniqueKey implements Serializable {
public UniqueKey(String id1, String id2) {
this.id1 = id1;
this.id2 = id2;
}
@Column(name = "id1")
private String id1;
@Column(name = "id2")
private String id2;
}
儿童实体:
@Entity
@Table(name = "parent", uniqueConstraints = {
@UniqueConstraint(columnNames = {
"id1",
"id2"
})
})
public class Parent implements Serializable {
@Id
private UniqueKey key;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = "id1", referencedColumnName = "id1", insertable = false,
updatable = false),
@JoinColumn(name = "id2", referencedColumnName = "id2", insertable = false,
updatable = false)
})
private Child child;
}
对于父母的一些查询我需要孩子,在某些情况下我不需要。
我试图通过uniqueKey获取但不是调用getChild(),但它仍然是与父级一起获取子数据。
在提到this answer之后。它说在@OneToOne的情况下它总是急切地获取数据,即使我们定义fetch = FetchType.LAZY。因为这是非常古老的答案所以我不知道它是否也发生在JPA 2.1中。
如果它也发生在JPA 2.1中,那么Fetch lazy的其他方式是什么 使用JPA criteriaBuilder?
答案 0 :(得分:0)
@OnetoOne
关系如果您需要从父级中选择UniqueKey
而不提取孩子 - 您可以尝试以下操作:
class UniqueKeyDto { private String s1; private String s2; UniqueKeyDto(String s1,String s2){ //省略 } }
然后像这样使用JPQL查询:
SELECT NEW UniqueKeyDto(p.child.key.s1, p.child.key.s2) FROM Parent p WHERE <conditions here>
这个查询显然可以优化,但我不确定哪些JPA实现可以实现这一点。
如果您的实现不支持这种优化,那么您的方式是本机查询。有时候进行原生查询非常好:)