使用RSQL获取枚举类型的数据时导致InvalidDataAccessApiUsageException

时间:2018-01-17 10:00:28

标签: java spring jpa enums

我有一个属性类型为enum的实体。 我正在尝试使用RSQL运行查询。我的问题是

siteType==LOCAL

但它是在异常下面生成的,因为在查询中我将siteType作为字符串值传递,但在JPA中,siteType是枚举。

org.springframework.dao.InvalidDataAccessApiUsageException:参数值[LOCAL]与预期类型[com.dataservice.api.site.wrapper.SiteType(n / a)]不匹配;嵌套异常是java.lang.IllegalArgumentException:参数值[permanent]与期望类型不匹配[com.dataservice.api.site.wrapper.SiteType(n / a)]

@Entity
@Table(name = "SITE")
public class Site {

    @Id
    @Column(name = "ID", updatable = false, nullable = false)
    private Long id;

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

    @Column(name = "SITE_TYPE")
    @Enumerated(EnumType.STRING)
    private SiteType siteType;

枚举:

 public enum SiteType {
    LOCAL, ONDEMAND;}

RSQL代码:

Node rootSearchNode = new RSQLParser().parse(searchQuery);
    Specification<Site> siteSearchSpec = rootSearchNode.accept(new CustomRsqlVisitor<Site>());
    resultSitesList = siteDataService.getSitesBySearchQuery(siteSearchSpec);

2 个答案:

答案 0 :(得分:0)

问题是它不知道如何将枚举的字符串表示形式映射到实际的枚举类型。我遇到了同样的问题,并通过将Entity更改为以下方法来解决它:

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

public void setSiteType(SiteType siteType) {
    this.siteType = siteType.name();
}

public SiteType getSiteType() {
    return Enum.valueOf(SiteType.class, siteType);
}

答案 1 :(得分:0)

private List<Object> castArguments(Root<T> root) {
List<Object> args = new ArrayList<Object>();
Class<? extends Object> type = root.get(property).getJavaType();

for (String argument : arguments) {
  if (type.equals(Integer.class)) {
    args.add(Integer.parseInt(argument));
  } else if (type.equals(Long.class)) {
    args.add(Long.parseLong(argument));
  } else if (type.equals(SiteType.class)) {
    args.add(SiteType.valueOf(argument));
  } else {
    args.add(argument);
  }
}

return args;
}

采纳评论中的建议。添加其他-如果检查您自己的枚举类型。