我有一个 Product 实体,其中包含带有此部分代码的仓库列表:
产品.java
@ManyToMany
@JoinTable(name = "product_has_warehouse", joinColumns = @JoinColumn(name = ID), inverseJoinColumns = @JoinColumn(
name = "warehouse_id"), foreignKey = @ForeignKey(name = FK + "has_warehouse"),
inverseForeignKey = @ForeignKey(name = FK + "warehouse"))
private List<Warehouse> warehouses;
Run Code Online (Sandbox Code Playgroud)
所以我需要做一个标准查询来按产品 id 获取仓库列表。
我试过:
final CriteriaQuery<Warehouse> query = getCriteriaBuilder().createQuery(Warehouse.class);
final Root<Product> root = query.from(Product.class);
final Join<Product, Warehouse> warehouseJoin = root.join("warehouses");
query.where(getCriteriaBuilder().in(warehouseJoin));
final TypedQuery<Warehouse> typedQuery = getEm().createQuery(query);
return typedQuery.getResultList();
Run Code Online (Sandbox Code Playgroud)
但我得到:
java.lang.IllegalArgumentException:验证标准时出错,原因如下:java.lang.IllegalStateException:没有显式选择,无法确定隐式选择
每次我从DB结构改变一些东西时,我都会创建一个新的迁移文件,使用时间戳按顺序执行,使用干净的数据库,使用迁移命令(使用maven插件或命令行工具),它可以很好地工作,但是在生产数据库中,相同的DB结构但添加了数据我得到了这个错误:
无法执行目标org.flywaydb:flyway-maven-plugin:3.2.1:在项目eee-ejb上迁移(main):org.flywaydb.core.api.FlywayException:验证失败.迁移校验和不匹配迁移1430224929 [错误] - >应用于数据库:-1639634536 [错误] - >本地解决:-1412099238
如何在不断添加数据的生产数据库中使用flyway?
application.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" version="6">
<description>DESCRIPTION</description>
<display-name>xxxsystem-ear</display-name>
<module>
<ejb>xxxsystem-ejb-3.1.1-SNAPSHOT.jar</ejb>
</module>
<module>
<web>
<web-uri>xxxsystem-web-3.1.1-SNAPSHOT.war</web-uri>
<context-root>/xxxsystem</context-root>
</web>
</module>
<library-directory>lib</library-directory>
</application>
Run Code Online (Sandbox Code Playgroud)
我运行后:mvn版本:清洁mvn版本:准备mvn版本:执行
所以我不得不手动将.jar和.war的版本更改为xml文件中的3.1.2。
有一种方法可以告诉Maven为我更改此文件中的版本吗?
我必须对jboss-deployment-structure.xml做同样的事情
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.apache.log4j" />
</exclusions>
</deployment>
<sub-deployment name="xxx-ejb-3.1.1-SNAPSHOT.jar">
<exclusions>
<module name="org.apache.log4j" />
</exclusions>
</sub-deployment>
<sub-deployment name="xxx-web-3.1.1-SNAPSHOT.war">
<exclusions>
<module name="org.apache.log4j" />
</exclusions>
</sub-deployment>
</jboss-deployment-structure>
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我使用Apache Commons lib有以下代码:
public static List<Address> addressesHasType(final List<Address> addresses, final AddressType... types) {
return (List<Address>) CollectionUtils.select(addresses, new Predicate() {
@Override
public boolean evaluate(final Object object) {
boolean isContains = false;
for (int i = 0; i < types.length && !isContains; i++) {
isContains = ((Address) object).getTypes().contains(types[i]);
}
return isContains;
}
});
}
Run Code Online (Sandbox Code Playgroud)
我试图重构它只使用没有Apache Commons lib的lambda和Java 8,如下所示:
List<Address> addressList = addresses.stream()
.filter(a -> a.getTypes().contains(types)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但这份名单最终变得空洞.我尝试使用findFirst()但它不返回List而是返回Optional对象.
addressList2 = addresses.stream()
.filter(a -> a.getTypes().contains(types)).findFirst();
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做?
可以在Lambda中执行此操作:
for (final WarehouseAddress address : warehouse.getAddresses()) {
if (!Validator.isEmpty(address.getPositions())) {
final Set<WarehouseAddressPosition> positions = new HashSet<WarehouseAddressPosition>(
address.getPositions());
if (address.getPositions().size() > positions.size()) {
throw new FieldDuplicatedException("position error");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我试过没有成功:
final Set<WarehouseAddressPosition> positions = warehouse.getAddresses().stream().filter(a -> !Validator.isEmpty(a.getPositions())).collect(
Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)
因为他试图收集一套WarehouseAdress而不是一套WarehouseAdressPosition.
错误:(130,156)java:不兼容类型:推理变量T具有不兼容的边界等式约束:br.com.erp.ejb.entity.sales.WarehouseAddressPosition下限:br.com.erp.ejb.entity.sales.WarehouseAddress
在Warehouse类我有:
private List<WarehouseAddress> addresses;
Run Code Online (Sandbox Code Playgroud)
在WarehouseAddress类中,我有:
private List<WarehouseAddressPosition> positions;
Run Code Online (Sandbox Code Playgroud)
说明:此代码获取位置的原始列表并将其收集在Set中,以创建没有重复值的集合并将大小与原始列表进行比较,以检查它是否重复.由于Set不接受重复值,因此在这种情况下大小将不同.