Spring数据JPA - 从一个实体参数中排除ID列

时间:2013-08-07 15:38:14

标签: java jpa primary-key one-to-many spring-data-jpa

我有两个实体:

@Entity
public class Car {

    @Id
    private Long id;

    @OneToOne
    private Engine engine;
}

和另一个:

@Entity
public class Engine {

    @Id
    private Long id;

    @Column
    private String value1;

    @Column
    private String value2;
}

在我的jpaRepositoy界面中,我想这样做:

public interface CarRepository extends JpaRepository<Car, Long> {

    public Car findByEngine(Engine engine);
}

但是这个方法不会返回我存储的实体,因为我创建了我的引擎:

Engine engine = new Engine("someValue", "someValue");

不设置存储在数据库中的引擎ID。

所以我想知道是否可以排除像id这样的列? 如果不是,唯一的方法是:

@Query("SELECT c FROM Car c WHERE c.engine.value1 = :value1 and c.engine.value2 = :value2")
findByEngine(@Param("value1") String value1, @Param("value2") String value2)

相关问题:如果我有OneToMany关系而不是OneToOne,比如

@Entity
public class Car {

    @Id
    private Long id;

    @OneToMany
    private List<Engine> engines;
}

如何执行此类请求(仍然没有id列):

public Car findByEngines(List<Engine> engines);

非常感谢!

1 个答案:

答案 0 :(得分:2)

对于您的方案,此@Query("SELECT c FROM Car c WHERE c.value1 = :value1 and c.value2 = :value2")不正确的jpql查询,value1实体中没有value2Car

正确的是:

@Query("SELECT c FROM Car c WHERE c.engine.value1 = :value1 and c.engine.value2 = :value2").

您可以尝试使用此方法名称,我认为这样可行:

findByEngineValue1AndEngineValue2(String value1, String value2)

但是对于列表一,我认为你不能用方法名称来弥补。