我有以下设置:
波乔:
@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);
但它会过滤我的表格,其中包含我在我的方法上传递的确切总线数组的行。我希望所有线路都带有以下总线(包括带有其他总线的线路和此总线列表)。
有任何想法吗 ?