很简单,假设您没有 10 年前的 JPA 版本,那么您可以创建两个接口(在本例中为存储库)并按照 JPA 命名约定命名方法。
这意味着,如果您有这样定义的类 ProductInfo:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ProductInfo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "product_info_id")
private long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "product_id")
private Product product;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "language_id")
private Language language;
private String description;
}
这将是您需要的相应的 Repository 方法,是的,如果您想让它干净和简单,您需要传递整个 Product。
@Repository
public interface ProductImageRepository extends JpaRepository<ProductImage, Long> {
public Optional<ProductImage> findByProductAndDevice(Product product, Device device);
}
ProductImage 也是如此
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ProductImage {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "product_image_id")
private long id;
@ManyToOne
@JoinColumn(name = "product_id")
private Product product;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "device_id")
private Device device;
private String image;
}
谁的存储库方法将是
@Repository
public interface ProductImageRepository extends JpaRepository<ProductImage, Long> {
public Optional<ProductImage> findByProductAndDevice(Product product, Device device);
}
那么你会想要一些包含产品信息的东西
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ProductToDisplay {
private Product product;
private String description;
private String imageLocation;
}
然后根据您拥有的信息创建该对象的服务
@Service
public class ProductToDisplayService {
@Autowired
private ProductInfoRepository productInfoRepository;
@Autowired
private ProductImageRepository productImageRepository;
@Autowired
private ProductRepository productRepository;
@Autowired
private DeviceRepository deviceRepository;
@Autowired
private LanguageRepository languageRepository;
public ProductToDisplay getProduct(long productID, long languageID, long deviceID) throws Exception {
Product product =
productRepository.findById(productID).orElseThrow(()-> new Exception(
"There is no such product"));
return new ProductToDisplay(product,
productInfoRepository.findByProductAndLanguage(product,
languageRepository.findById(languageID).orElseThrow(()-> new Exception(
"There is no such product"))).orElseThrow(()-> new Exception(
"There is no such product info")).getDescription(),
productImageRepository.findByProductAndDevice(product,
deviceRepository.findById(deviceID).orElseThrow(()-> new Exception(
"There is no such product"))).orElseThrow(()-> new Exception(
"There is no such product Image")).getImage());
}
}
这里可能看起来有点混乱,对此我很抱歉,但这更清楚一点
public ProductToDisplay getProductClear(long productID, long languageID,
long deviceID) throws Exception {
Product product =
productRepository.findById(productID).orElseThrow(()-> new Exception(
"There is no such product"));
Language language = languageRepository.findById(languageID).orElseThrow(()-> new Exception(
"There is no such language"));
ProductInfo prodInfo = productInfoRepository.findByProductAndLanguage(product, language)
.orElseThrow(()-> new Exception(
"There is no such product info"));
Device device = deviceRepository.findById(deviceID).orElseThrow(()-> new Exception(
"There is no such image"));
ProductImage prodImg = productImageRepository.findByProductAndDevice(product, device)
.orElseThrow(()-> new Exception(
"There is no such product Image"));
return new ProductToDisplay(product,
prodInfo.getDescription(), prodImg.getImage());
}