gpt4 book ai didi

java - 如何使用 QuerydslPredicate 按子对象属性进行过滤?

转载 作者:太空宇宙 更新时间:2023-11-04 09:44:23 25 4
gpt4 key购买 nike

我有一个“宠物”域和一个“人”域,一个人可能有一只宠物。在我的 RestController 上使用 QuerydslPredicate,我想仅返回拥有“DOG”类型宠物的人。

Pet.java

@Entity
public class Pet {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false)
private String name;

@Enumerated(EnumType.STRING)
@Column(nullable = false, name = "animal_type")
private AnimalType type;

// constructors & getters/setters
}


enum AnimalType {
DOG, CAT
}

Person.java

@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false)
private String name;

@Column(nullable = false)
private String surname;


@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
@JoinColumn(name = "pet_id")
private Pet pet;

// constructors & getters/setters
}

PersonController.java

@RestController
@RequestMapping("persons")
public class PersonController {

@Autowired
private PersonRepository personRepository;

@GetMapping
public List<Person> getAll(@QuerydslPredicate(root = Person.class) Predicate predicate)
{
return (List<Person>) personRepository.findAll(predicate);
}
}

PersonRepository.java

public interface PersonRepository extends JpaRepository<Person, Long>, QuerydslPredicateExecutor<Person> {
}

我只想通过如下 GET 请求查询养狗的人:

localhost:8080/persons?pet.type=DOG

但这会导致以下错误:

{
"timestamp": "2019-04-09T18:11:23.430+0000",
"status": 500,
"error": "Internal Server Error",
"message": "Could not access method: Class org.springframework.util.ReflectionUtils can not access a member of class com.example.demo.domain.QPerson with modifiers \"protected\"",
"path": "/persons"
}

尽管使用localhost:8080/persons?name=Tom查询名为“Tom”的人效果很好。

我有这个仓库可用 here .

我已经尝试过 this 的解决方案, this , this ,和this stackoverflow 问题,但还无法使其工作。

最佳答案

只需将 pom.xml 中的 querydsl.entityAccessors 属性更改为 false(或将其删除,默认值为 false)。

为什么会发生这种情况?

在您的 pom.xml 中,您具有以下配置:

<querydsl.entityAccessors>true</querydsl.entityAccessors>

此选项会使您的关系在类中创建为 protected 方法,因此会出现错误 ( https://github.com/querydsl/querydsl/blob/master/querydsl-codegen/src/main/java/com/querydsl/codegen/EntitySerializer.java#L211 )。

if (config.useEntityAccessors()) {
writer.protectedField(queryType, field.getEscapedName());
} else {
writer.publicFinal(queryType, field.getEscapedName());
}

关于java - 如何使用 QuerydslPredicate 按子对象属性进行过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55599767/

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