【问题标题】:JPA - Select when parameter is a member of attribute, attribute is a set of stringJPA - 当参数是属性的成员时选择,属性是一组字符串
【发布时间】:2018-11-02 05:58:36
【问题描述】:

NoticeGroupEntity:

@Id
@Column(name = "id")
private long id;

@Column(name = "name")
private String name;

@Column(name = "allowed_user_statuses")
@Convert(converter = StringSetConverter.class)
private Set<String> allowedUserStatuses;

这是StringSetConverter

public class StringSetConverter implements AttributeConverter<Set<String>, String> {

@Override
public String convertToDatabaseColumn(Set<String> list) {
    return String.join(",", list);
}

@Override
public Set<String> convertToEntityAttribute(String joined) {
    return new HashSet<>(Arrays.asList(joined.split(",")));
}

我尝试使用 JPA 选择 NoticeGroupEntity

@Query("SELECT ng FROM #{#entityName} ng WHERE ?1 IN ng.allowedUserStatuses")
List<NoticeGroupEntity> findByAllowedUserStatus(String userStatus);

有什么办法选择吗?它不返回任何实体。 谢谢。

【问题讨论】:

  • 这种方式不起作用。您的状态集仅在实体层可用,但您的查询将被转换为原生 sql 并在 db 层中运行。
  • 实体名称不能使用 SpeL 表达式:spring.io/blog/2014/07/15/…
  • @SándorJuhos 也许你是对的。我会研究它。我已经用另一种方式解决了这个问题。

标签: java sql spring-data-jpa


【解决方案1】:

你的@Query好奇怪。

试试这个:

@Query("SELECT ng FROM NoticeGroupEntity ng WHERE ?1 member ng.allowedUserStatuses")

上述工作适用于实体。我还没有尝试过原始类型。

如果它不起作用,原生查询会来拯救:

@Query(value = "SELECT ng FROM NoticeGroupEntity ng WHERE ng.allowed_user_statuses LIKE ?1", native = true)

并将您的参数传递为"%" + status + "%"

【讨论】:

  • 我尝试了你的答案,但也不起作用,谢谢,请注意 ng.allowedUserStatuses 是一组字符串,而 userStatus 只是一个字符串,可能是 ng.allowedUserStatuses 的成员。
  • “成员”而不是“成员”。它抛出 java.lang.IllegalArgumentException: Validation failed for query
  • 它不适用于原语?您可以尝试原生查询。修改您的查询以匹配普通 SQL,它始终有效
  • 是的,类似 %status% 的 sql 是新想法,但如果 ng.allowed_user_statuses 包含:ACTIVE, INACTIVE 则应该是全部。
  • 您有两个选择:规范化您的数据库以拆分 Status 而不是作为列加入或创建接受特殊值的自定义查询
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
相关资源
最近更新 更多