【问题标题】:Spring data and query methodsSpring数据和查询方法
【发布时间】:2016-01-19 07:31:18
【问题描述】:

我是 Spring 数据的新手,我正在研究如何使用它。 我认为我需要两种类型的查询: 1)我可以通过这样的查询方法获得的简单查询

public interface CarRepository extends JpaRepository<Car, Integer> {
    List<Car> findByid_Fleet(int idFleet);
}

但我得到无效的派生查询!未找到 String 类型的财产队!遍历路径: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);

}

carServicesImpl

@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);
....

【问题讨论】:

    标签: java mysql spring spring-data


    【解决方案1】:

    对于您的第一个问题:您没有将外键名称作为方法名称,而是将成员名称:在您的汽车类中,您有一个名为 Fleet 的字段,而在 Fleet 类中,有一个名为 idFleet 的字段? 那么名称应该是:

    `List<Car> findByFleetIdFleet(int idFleet);`
    

    对于第二个问题,您需要一个自定义存储库,您将在其中实现这些“复杂”查询:

    1 - public interface CarRepository extends JpaRepository&lt;Car, Integer&gt;, CarRepositoryCustom

    2 - public interface CarRepositoryCustom

    3 - public class CarRepositoryImpl implements CarRepositoryCustom

    在自定义接口中,只需声明方法...并在类中实现它们..spring 会做一些魔术(按名称代理接口/类)并且您的自定义查询将可用

    自定义类中的代码应该是这样的:

    @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();
    }
    

    【讨论】:

    • 那个错误,我的汽车类中有 Fleet 对象。所以我必须通过 id 检索 Fleet 并将这个对象放入 findByFleet 方法中?
    • 不,只需命名您的方法:findByFleetId ...它将首先检查 Car 类中的成员 Fleet,然后检查 Fleet 类中的 Id 成员...
    • 如果我使用 List findByFleetId(int idFleet);我收到无效的派生查询!没有找到类型 Fleet 的属性 ID!遍历路径:Car.fleet。
    • 您的 Fleet 类中有属性 id 吗?
    • 我不得不重命名 List findByFleetIdFleet(int idFleet);因为 Fleet 有 idFleet....是正确的吗?
    猜你喜欢
    • 2019-04-01
    • 2013-09-29
    • 2020-01-16
    • 2014-11-04
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多