gpt4 book ai didi

java - Hibernate criteria查询,仅过滤子类实体

转载 作者:行者123 更新时间:2023-12-02 00:51:21 26 4
gpt4 key购买 nike

提供,有下一个层次结构:

@Inheritance(strategy = InheritanceType.JOINED)
Class A{
String name;
}

Class B extends A{
boolean isActive;
}

然后,我需要按几个条件进行过滤,包括 isActive

我决定处理规范。但面临一个问题。当我通过 isActive = false 进行过滤时,我得到了带有 isActive=false 的所有子类实体。完全忽略父类实体。我的预期结果是从父类获取所有实体,并从 suClass 过滤实体。有人知道如何处理吗?

最佳答案

我认为您的案例不需要规范。我猜你想通过 child 的属性(property)来获得 parent 。我建议您对 boolean 属性使用 Boolean 类,因为它将区分 nullfalse 值。要按类(class)选择 child ,您可以使用 JPQL TYPE 运算符。您可以在此处找到有关如何操作的示例:

父类:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Getter
@Setter
public class Foo {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
}

child 1类:

@Entity
@Getter
@Setter
public class Bar extends Foo {
private Boolean active;
}

child 2类:

@Entity
@Getter
@Setter
public class Qux extends Foo {
private Boolean done;
}

存储库:

public interface FooRepository extends JpaRepository<Foo, Long> {
@Query("select f from Foo f where TYPE(f) = Bar and f.active = false")
List<Foo> findByActive();
}

测试类:

@RunWith(SpringRunner.class)
@SpringBootTest
public class FooTests {

@Autowired
private FooRepository fooRepository;

@Before
public void setup() {
Bar bar1 = new Bar();
bar1.setActive(false);
Foo foo1 = bar1;
foo1.setName("foo1");
fooRepository.save(foo1);

Bar bar2 = new Bar();
Foo foo2 = bar2;
foo2.setName("foo2");
fooRepository.save(foo2);

Foo foo3 = new Qux();
foo3.setName("foo3");
fooRepository.save(foo3);
}

@Test
public void test() {
System.out.println(fooRepository.findByActive());
}
}

希望对您有帮助。

关于java - Hibernate criteria查询,仅过滤子类实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57855854/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com