当前位置: 首页 > 知识库问答 >
问题:

Spring JPA查询检查参数列表中是否至少存在一个列表元素

牟恺
2023-03-14
@Query("select item from Item item where item.allowedGroups.id in ?1")
Page<Object> findByAllowedGroups(List<Long> userGroupIds, Pageable pageable);
org.hibernate.QueryException: illegal attempt to dereference collection [item0_.id.allowedGroups] with element property reference [id]
@Entity
@Table(name = "item")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Item extends AbstractAuditingEntity implements Serializable,Comparable<File> {

private static final long serialVersionUID = 1L;

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

@ManyToMany(fetch = FetchType.EAGER)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@JoinTable(name = "item_allowed_groups",
    joinColumns = @JoinColumn(name="item_id"),
    inverseJoinColumns = @JoinColumn(name="group_id"))
private Set<Group> allowedGroups = Sets.newHashSet();

// getters and setters

小组类:

@Entity
@Table(name = "group")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Group implements Serializable {

private static final long serialVersionUID = 1L;

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

@NotNull
@Size(max = 50)
@Column(name = "name", length = 50, nullable = false)
private String name;

// getters and setters

共有1个答案

孙星鹏
2023-03-14

我通过设置Spring JPA QueryDSL并在这个堆栈溢出答案中实现解决方案来解决这个问题:https://stackoverflow.com/a/33455117/3285398。我将BooleanExpression修改为以下内容:

public static BooleanExpression hasItemAccess(List<Group> groups) {
    QItem item = QItem.item;
    return item.allowedGroups.any().in(groups);
}

并向ItemRepository添加了一个查询方法:

public interface ItemRepository extends JpaRepository<Item,Long>, QueryDslPredicateExecutor<Item> {

@Query("select item from Item item where item.user.login = ?#{principal.username}")
Page<Item> findByUserIsCurrentUser(Pageable pageable);

Page<Item> findAll(Predicate predicate, Pageable pageable);

}

 类似资料:
  • 问题内容: 假设我有一个列表, 并且我想知道其中的至少一个数字是否存在于另一个列表中,例如这个列表: 换句话说,我想知道list中是否存在1,2或3 。我现在可以做类似的事情 但是,是否可能有一种方法可以使事情整齐? 问题答案: 有很多方法可以做到这一点。最直接的翻译是: 您还可以使用各种涉及集合的东西,例如: (这取决于元素是可哈希的,但如果这是真的,这很可能会更快地制定一套较大的出来的,并为任

  • 问题内容: 我正在尝试比较两个列表,如果第二个列表中有第一个列表中的任何值,则只打印一条消息。 在此示例中,我要对进行求值,因为两个列表中都包含5。这行不通,而且我不确定比较这两个列表的最简单方法。 问题答案: 您可以用很多方法解决。一个很容易理解的方法就是只使用一个循环。 一个更紧凑的方法是使用和: 更好的是,可以将其替换为: 您还可以使用集合:

  • 问题内容: 我有两个带有不同对象的列表。 我想检查list2中的元素是否存在于list2中,基于特定的属性(Object1和Object2具有(以及其他),一个共有属性(类型为Long),名为attributeSame)。 现在,我这样做是这样的: 但是我认为有一种更好,更快的方法可以做到这一点:)有人可以提出吗? 谢谢! 问题答案: 如果只需要测试基本相等性,则可以使用基本JDK来完成,而无需在

  • 我有两个不同对象的列表。 我想根据特定的属性(Object1和Object2有一个共同的属性(类型为Long),名为AttributeName),检查list2中是否存在list1中的元素。 现在,我是这样做的: 但我认为有更好更快的方法可以做到这一点:)有人能提出吗? 谢谢

  • 问题内容: 如何最好地编写Python函数()以有效测试元素()是否至少出现在列表()中几次? 我的第一个想法是: 但是,一旦发现次数,它就不会短路,并且始终为O(n)。 造成短路的简单方法是: 我也有一个带有发电机的更紧凑的短路解决方案: 还有其他好的解决方案吗?什么是最有效的方法? 谢谢 问题答案: 而不会造成额外的开销用的设置的对象,并使用具有测试 感实性 每一个项目,你可以使用推动发电机提

  • 我需要验证表中是否已经存在列。我的类扩展了CustomTaskChange,因此我的方法接收一个数据库对象作为参数。我可以通过ResultSetObject进行我想要的验证吗?

  • 问题内容: 我有两个列表,一个包含 相册,文件对的 列表,另一个仅包含有关一张照片的信息- 相册 (位置0)和 文件 (位置1) 如何查看 照片 列表是否在 照片 列表中?就像字符串一样。 相册 , 文件的 位置无关紧要,因为不会有任何 文件 等于 相册 。 问题答案: 同样喜欢字符串。不仅如此,也是 如此 。也适用于列表中的列表: 对列表的成员资格测试仅迭代列表,并对每个元素使用相等性测试以查看

  • 问题内容: 如何查看索引是否包含某些数字? 问题答案: 您将为此进行字符串比较 询问数字是否“在”另一个数字中并没有真正的意义(除非您对“在”具有特定的定义)