2015-10-20 81 views
0

我在春天的數據是新的,我正在學習如何使用它。 我想,我需要兩個類型的查詢: 1)簡單的查詢,我可以查詢方法獲得這樣春數據和查詢方法

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

,但我獲得無效的衍生查詢!找不到類型爲String的物業車隊!遍歷路徑:Car.id. 車表中有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); 
.... 

回答

0

關於第一個問題:你不把外鍵的名稱作爲方法名,但成員的名字:在您的汽車類,你有一個字段命名艦隊和艦隊類,一個名爲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

在自定義界面中,只是申報方法......而在類中,實現他們..春天還會做一些魔術(代理接口/按名稱類)和自定義查詢將可

定製類代碼應該是這樣的:

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

這個錯誤,我有艦隊對象在我的車類。所以我必須通過id檢索Fleet,並將此對象放入findByFleet方法中? – luca

+0

沒有,只是命名方法:findByFleetId ...它會首先檢查會員艦隊在汽車類,年底然後檢查ID件艦隊類... – Pras

+0

如果我使用List findByFleetId(INT idFleet);我收到無效派生查詢!找不到類型爲Fleet的媒體資源ID!遍歷路徑:Car.fleet。 – luca