java - Spring数据及查询方法

标签 java mysql spring spring-data

我是 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/

相关文章:

php - 跨不同的 MySQL 列进行不区分大小写的搜索

php - CSV,将多行数据合并为单行并合并到同一列中

java - 如何强制 SpringBoot 使用多个配置类中的一个且仅一个?

java - 当 url 包含分号时,Spring 5 中获取 500 响应

java - java 序列中的服务(线程)

java - 如何区分从 HTML 表单提交的 HTTP 请求和从客户端提交的 HTTP 请求?

netbeans 中的 Java 程序无法正常运行,但在调试时工作得很好

mysql - 我可以在 INSERT 查询中使用 SELECT 子查询吗?

java - 如何通过 gradle 任务使用 spring 配置文件运行 bootRun

java - 帮助我的 Android obj 加载器上的 UV