弹簧数据@query'缓存'表?

时间:2017-06-06 09:20:17

标签: java spring hibernate spring-data

应用实体

@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

3 个答案:

答案 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);