JPA标准生成器“;在;外键谓词错误:对象比较只能使用equal()或notEqual()运算符
我想通过查看哪些用户有权检索该文件,从表中选择一个文件引用列表。为此,我有3个表,一个文件表、一个访问控制表和一个用户表 我正在使用JPA和Criteriabuilder(因为涉及到更多的表,我需要dynamicle创建查询,为了可读性,我在这个问题中省略了其他表和谓词) 下面的代码可以工作JPA标准生成器“;在;外键谓词错误:对象比较只能使用equal()或notEqual()运算符,jpa,criteria,predicate,Jpa,Criteria,Predicate,我想通过查看哪些用户有权检索该文件,从表中选择一个文件引用列表。为此,我有3个表,一个文件表、一个访问控制表和一个用户表 我正在使用JPA和Criteriabuilder(因为涉及到更多的表,我需要dynamicle创建查询,为了可读性,我在这个问题中省略了其他表和谓词) 下面的代码可以工作 CriteriaBuilder queryBuilder = em.getCriteriaBuilder(); CriteriaQuery<File&
CriteriaBuilder queryBuilder = em.getCriteriaBuilder();
CriteriaQuery<File> queryDefinition = queryBuilder.createQuery(File.class);
Root<File> FileRoot = queryDefinition.from(File.class);
List<Predicate> predicateList = new ArrayList<Predicate>();
Predicate userPredicate = FileRoot .join("FileAccesControlCollection").join("userId").get("usersId").in(loggedInUser.getUsersId());
predicateList.add(userPredicate );
queryDefinition.where(predicateArray).distinct(true);
Query q = em.createQuery(queryDefinition);
List<Files> results = (List<Files>) q.getResultList();
但我猜,因为FileAccesControlCollection实体类中的userId值是对Users类的foreignkey引用,所以我得到以下错误:
Exception Description: Object comparisons can only use the equal() or notEqual() operators. Other comparisons must be done through query keys or direct attribute level comparisons.
是否有一种方法,使用loggedInUser实体或其Id,通过将File类加入FileAccesControlCollection类并对userId外键进行过滤来过滤文件?我对JPA有点陌生,使用谷歌会让我看到很多页面,但对于一些我认为可能的事情,却没有一个明确的答案 那么“userId”被映射为OneToOne?那你就可以
get("userId").get("id").in(...)
您还可以在EclipseLink中为外键字段使用描述符密码器添加查询键,然后在查询中使用它
get("userFk").in(...)
试试这个:
Predicate userPredicate = FileRoot.join(FileAccesControlCollection.class).join(Users.class).get("{id field name in class Users}").in(loggedInUser.getUsersId());
祝你好运。不,从访问控制到用户ID之间存在多对一关系。我不知道如何使用描述符编辑器在EclipseLink中添加查询键。我不想对我的实体类进行很多手动编辑。
Predicate userPredicate = FileRoot.join(FileAccesControlCollection.class).join(Users.class).get("{id field name in class Users}").in(loggedInUser.getUsersId());