我是 Spring 数据新手,正在研究如何使用它。 我认为我需要两种类型的查询: 1)我可以通过这样的查询方法获得简单的查询
public interface CarRepository extends JpaRepository<Car, Integer> {
List<Car> findByid_Fleet(int idFleet);
}
但是我得到了无效的派生查询!未找到字符串类型的属性(property)舰队!遍历的路径:Car.id。 在 car 表中有一个外键 id_fleet。
2)我需要复杂的查询,我该如何编写它们? 我的代码是如此结构化(一个域类的示例):
public interface CarRepository extends JpaRepository<Car, Integer> {
List<Car> findByid_Fleet(int idFleet);
}
汽车服务
public interface CarServices extends GeneralServices<Car, Integer>{
/**
* Return list of cars for one fleet
* @param idFleet
* @return
*/
public List<Car> findCarsByIdFleet(int idFleet);
}
汽车服务Impl
@Service
public class CarServicesImpl implements CarServices {
@Resource
private CarRepository carRepository;
@Override
public Car create(Car car) {
return carRepository.save(car);
}
@Override
public Car findById(Integer id) {
return carRepository.getOne(id);
}
@Override
public boolean exists(Integer id) {
return carRepository.exists(id);
}
@Override
public List<Car> findCarsByIdFleet(int idFleet) {
return carRepository.findByid_Fleet(idFleet);
}
}
以及我将数据库方法分组的数据库服务
@Service
public class DatabaseFleetsAndCarsServicesImpl implements DatabaseFleetsAndCarsServices {
static final Logger LOG = LoggerFactory.getLogger(DatabaseFleetsAndCarsServicesImpl.class);
@Autowired
private CarServices carServices;
@Autowired
private FleetServices fleetServices;
@Override
public List<Fleet> getFleets() {
return fleetServices.getFleets();
}
@Override
public List<Car> getCars(int idFleet) {
return carServices.findCarsByIdFleet(idFleet);
}
}
我的汽车类别的一部分:
/**
* Car generated by hbm2java
*/
@Entity
@Table(name = "car", catalog = "ATS")
public class Car implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer idCar;
private CarType carType;
private Fleet fleet;
private String id;
private int initialKm;
private String carChassis;
private String note;
private Set<Acquisition> acquisitions = new HashSet<Acquisition>(0);
....
最佳答案
对于你的第一个问题:你没有将外键名称作为方法名称,而是将成员的名称放在其中:在你的汽车类中,你有一个名为 Fleet 的字段,在 Fleet 类中,有一个名为 idFleet 的字段? 那么名称应该是:
`List<Car> findByFleetIdFleet(int idFleet);`
对于第二个问题,您需要一个自定义存储库,您将在其中实现这些“复杂”查询:
1 - public interface CarRepository extends JpaRepository<Car, Integer>, CarRepositoryCustom
2 - public interface CarRepositoryCustom
3 - public class CarRepositoryImpl implements CarRepositoryCustom
在自定义接口(interface)中,只需声明方法...并在类中实现它们.. spring 将执行一些魔法(按名称代理接口(interface)/类),并且您的自定义查询将可用
自定义类中的代码应如下所示:
@PersistenceContext
private EntityManager entityManager;
public List<Car> findAllCars() {
String jpql = "select c from Car c";
Query query = entityManager.createQuery(jpql);
return query.getResultList();
}
(并带有参数):
public List<Car> findAllByCarChassis(String chassis) {
String jpql = "select c from Car c where c.carChassis = :chassisParam";
Query query = entityManager.createQuery(jpql);
query.setParameter("chassisParam", chassis);
return query.getResultList();
}
关于java - Spring数据及查询方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33240053/