【问题标题】:Filter by array using spring repository使用 spring 存储库按数组过滤
【发布时间】:2017-06-13 14:23:07
【问题描述】:

我有以下设置:

波乔:

@Data
@EqualsAndHashCode
@ToString
@NoArgsConstructor
@Entity
@Immutable
public class ExchangeView {

    @Id
    private Long id;

    private Integer number;

    @Type(type = "com.myapp.domain.custom.StringArrayType")
    private String[] exchangeObjects, environments, bus;

    private String name, technology, type;

}

自定义类型:

public class StringArrayType implements UserType{

private final int[] arrayTypes = new int[] { Types.ARRAY };

@Override
public int[] sqlTypes() {
    return arrayTypes;
}

@Override
public Class<String[]> returnedClass() {
    return String[].class;
}

@Override
public boolean equals(Object x, Object y) throws HibernateException {
    return x == null ? y == null : x.equals(y);
}

@Override
public int hashCode(Object x) throws HibernateException {
    return x == null ? 0 : x.hashCode();
}

@Override
public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException {
    // get the first column names
    if (names != null && names.length > 0 && rs != null && rs.getArray(names[0]) != null) {
        String[] results = (String[]) rs.getArray(names[0]).getArray();
        return results;
    }
    return null;
}

@Override
public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException,
        SQLException {
    // setting the column with string array
    if (value != null && st != null) {
        String[] castObject = (String[]) value;
        Array array = session.connection().createArrayOf("varchar", castObject);
        st.setArray(index, array);
    } else {
        st.setNull(index, arrayTypes[0]);
    }
}

@Override
public Object deepCopy(Object value) throws HibernateException {
    return value == null ? null : ((String[]) value).clone();
}

@Override
public boolean isMutable() {
    return false;
}

@Override
public Serializable disassemble(Object value) throws HibernateException {
    return (Serializable) value;
}

@Override
public Object assemble(Serializable cached, Object owner) throws HibernateException {
    return cached;
}

@Override
public Object replace(Object original, Object target, Object owner) throws HibernateException {
    return original;
}

public StringArrayType toStringArrayType(List<String> strings){


    return null;
}

}

还有 Spring 存储库:

public interface ExchangeViewRepository extends Repository<ExchangeView, Long> {

    List<ExchangeView> findAll();

    List<ExchangeView> findByEnvironments(String[] environments);


    List<ExchangeView> findByBus(String[] bus);
}

在我的数据库中,我得到了一些这样的数据:

id      name        type    technology      environments                   bus

33      REGROUP     batch   ESB webMethods  {PREPRODUCTION,PRODUCTION,RECETTE}  {ASFR,BCIT}
34      CONDPAI     batch   ESB webMethods  {PREPRODUCTION,PRODUCTION,RECETTE}  {ASFR}

在我的控制器中我正在尝试使用这种方法

List<ExchangeView> findByBus(String[] bus);

但它过滤了我的表格,其中包含我在我的方法上传递的确切总线数组的行。 我希望所有线路都与以下公共汽车(包括与其他公共汽车的线路和此公共汽车列表)。

有什么想法吗?

【问题讨论】:

    标签: arrays spring hibernate spring-mvc spring-repositories


    【解决方案1】:

    您可以在存储库中使用本机查询来查找包含给定总线的所有ExchangeViews。我对 hsqldb 进行了测试,它按预期工作。

    @Query(nativeQuery = true, value = "select * from EXCHANGE_VIEW where POSITION_ARRAY(:bus IN bus) > 0")
    List<ExchangeView> findByBus(@Param("bus") String bus);
    

    查询会因您的 dbms 而异。

    更新

    要获取具有 any 给定总线之一的所有行,您可以使用以下查询:

    @Query(nativeQuery = true, value = "select * from EXCHANGE_VIEW where id in ( select id from EXCHANGE_VIEW, unnest(bus) as bus(b) where b in(:bus_names))")
    List<ExchangeView> findByBus(@Param("bus_names") List<String> buses);
    

    【讨论】:

    • 我正在寻找字符串名称“总线”的列表,而不是单个字符串
    • 您想获取所有总线包含任何查询总线的行吗?所以 findByBus(new String[]{"ASFR","BCIT"}) 返回两行还是只返回第一行?
    • 两行,并排除带有总线的线路,例如 {"ASIT","BCIT"}(不包含 1 个 elem {"ASFR"} 的列表)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 2021-01-03
    • 2016-07-02
    • 2020-07-12
    • 2017-01-10
    • 1970-01-01
    相关资源
    最近更新 更多