Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA标准生成器“;在;外键谓词错误:对象比较只能使用equal()或notEqual()运算符_Jpa_Criteria_Predicate - Fatal编程技术网

JPA标准生成器“;在;外键谓词错误:对象比较只能使用equal()或notEqual()运算符

JPA标准生成器“;在;外键谓词错误:对象比较只能使用equal()或notEqual()运算符,jpa,criteria,predicate,Jpa,Criteria,Predicate,我想通过查看哪些用户有权检索该文件,从表中选择一个文件引用列表。为此,我有3个表,一个文件表、一个访问控制表和一个用户表 我正在使用JPA和Criteriabuilder(因为涉及到更多的表,我需要dynamicle创建查询,为了可读性,我在这个问题中省略了其他表和谓词) 下面的代码可以工作 CriteriaBuilder queryBuilder = em.getCriteriaBuilder(); CriteriaQuery<File&

我想通过查看哪些用户有权检索该文件,从表中选择一个文件引用列表。为此,我有3个表,一个文件表、一个访问控制表和一个用户表

我正在使用JPA和Criteriabuilder(因为涉及到更多的表,我需要dynamicle创建查询,为了可读性,我在这个问题中省略了其他表和谓词)

下面的代码可以工作

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());