我的情况如下:
@Entity
@Table(name = "ANIMAL")
@Inheritance(strategy = InheritanceType.JOINED)
public class Animal implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "S_ANIMAL")
@SequenceGenerator(name = "S_ANIMAL", sequenceName = "S_ANIMAL", allocationSize = 1)
public int getNumero() {
return numero;
}
public void setNumero(int numero) {
this.numero = numero;
}
.
.
.
}
并作为子类:
@Entity
@Table(name = "DOG")
public class Dog extends Animal {
private static final long serialVersionUID = -7341592543130659641L;
.
.
.
}
我有一个像这样的JPA Select语句:
SELECT a FROM Animal a;
我正在使用Hibernate 3.3.1
我可以看到框架使用左外连接检索Animal
和Dog
的实例。
有没有办法只选择“部分”Animal
?我的意思是,之前的Select
将获得所有Animal
s,仅Animal
但不是Dog
s的Dog
和Dog
s。
我想要所有这些,但在@org.hibernate.annotations.Entity(polymorphism = PolymorphismType.EXPLICIT)
s的情况下,我只想检索它们的“动物部分”。
我找到了@Entity
但正如我所看到的,只有当Animal不是{{1}}时才有效。
非常感谢。
答案 0 :(得分:2)
简短回答:您描述的行为符合JPA标准。没有JPA标准方法来限制JPA提供程序仅检索超类。
提供者可以选择查询实现逻辑来实现功能,一致性和性能。只要它尊重您的实体注释并在查询中返回所请求的信息,一切都很好。将Dog的外部联接视为私有实现细节,不应该与您有关。提供程序已编写外部联接以协助性能和一致性。
考虑:
答案 1 :(得分:0)
实际上,有一种方法可以获得超类:您只需要使用JPA的本机查询。就我而言,我正在使用JPA存储库。因此,它会是这样的:
@Query(value = "SELECT * FROM animal", nativeQuery = true)
List<Resource> findAllAnimal();
标志nativeQuery为true允许在数据库上运行本机SQL。
如果您使用的是实体管理器,请查看以下内容:https://www.thoughts-on-java.org/jpa-native-queries/