应用实体
@Entity
@Table(name = "app")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class App implements Serializable {
@ManyToMany
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@JoinTable(name = "app_alloweduser",
joinColumns = @JoinColumn(name="apps_id", referencedColumnName="id"),
inverseJoinColumns = @JoinColumn(name="allowedusers_id", referencedColumnName="id"))
private Set<User> allowedusers = new HashSet<>();
}
我尝试编写自己的查询。
@Query("SELECT app FROM App app WHERE (:department is null or app.department = :department) and "
+ "(:platform is null or app.platform = :platform) and "
+ "(:appName is null or lower(app.appName) LIKE CONCAT('%',lower(:appName),'%')) and "
+ "(app.id in (SELECT b.apps_id FROM allowedusers b where b.allowedusers_id = :loginid))")
Page<App> findAllAllowed(@Param("department") Department department,
@Param("platform") Platform platform,
@Param("appName") String appName,
@Param("loginid") Long loginid,
Pageable pageable);
错误:org.hibernate.hql.internal.ast.QuerySyntaxException: allowedusers is not mapped
我也试过了app_alloweduser
,它也抛出了它无法映射的错误。我感兴趣的表格APP_ALLOWEDUSER
已经过验证。所以我想知道这里发生了什么。
一些背景
表格app_alloweduser
有2列,app_id
&amp; user_id
。首先,我必须检索app_id
的{{1}}列表。然后从此user_id
列表中返回所有app
。
答案 0 :(得分:0)
尝试将FROM allowedusers
替换为FROM app.allowedusers
答案 1 :(得分:0)
没有允许的用户实体只有App和User。尝试使用连接。
@Query("SELECT app FROM App app join User u WHERE (:department is null or app.department = :department) and "
+ "(:platform is null or app.platform = :platform) and "
+ "(:appName is null or lower(app.appName) LIKE CONCAT('%',lower(:appName),'%')) and "
+ "(u.allowedusers_id = :loginid))")
更新:
将u.allowedusers_id = :loginid
更改为u.id = :loginid
。
你没有在HQL中拥有该表。当然,如果需要APP_ALLOWEDUSER
答案 2 :(得分:0)
我发现我可以通过a.allowedusers
鉴于以下声明或特别是此行,
inverseJoinColumns = @JoinColumn(name="allowedusers_id", referencedColumnName="id"))
我可以在JPQL上使用app_alloweduser.allowedusers_id
访问等效于a.allowedusers.id
的数据库。
@JoinTable(name = "app_alloweduser",
joinColumns = @JoinColumn(name="apps_id", referencedColumnName="id"),
inverseJoinColumns = @JoinColumn(name="allowedusers_id", referencedColumnName="id"))
private Set<User> allowedusers = new HashSet<>();
最终查询
@Query("SELECT a FROM App a JOIN a.allowedusers au WHERE au.id = :loginid AND "
+ "(:department is null or a.department = :department) AND "
+ "(:platform is null or a.platform = :platform) AND "
+ "(:appName is null or lower(a.appName) LIKE CONCAT('%',lower(:appName),'%'))")
Page<App> findAllAllowed(@Param("department") Department department,
@Param("platform") Platform platform,
@Param("appName") String appName,
@Param("loginid") Long loginid,
Pageable pageable);