带参数属性的Spring数据JPA查询

时间:2012-05-29 16:07:37

标签: spring jpa spring-data spring-data-jpa

使用输入参数的属性作为查询参数声明Spring数据JPA查询的最简单方法是什么?

例如,假设我有一个实体类:

public class Person {
    @Id
    private long id;

    @Column
    private String forename;

    @Column
    private String surname;
}

和另一个班级:

public class Name {
    private String forename;
    private String surname;

    [constructor and getters]
}

...然后我想编写一个Spring数据存储库,如下所示:

public interface PersonRepository extends CrudRepository<Person, Long> {
    @Query("select p from Person p where p.forename = ?1.forename and p.surname = ?1.surname")
    findByName(Name name);
}

...但是Spring数据/ JPA不喜欢我在?1参数上指定属性名称。

最新的选择是什么?

10 个答案:

答案 0 :(得分:81)

此链接将帮助您:支持SpEL表达式的Spring Data JPA M1。类似的例子是:

@Query("select u from User u where u.firstname = :#{#customer.firstname}")
List<User> findUsersByCustomersFirstname(@Param("customer") Customer customer);

https://spring.io/blog/2014/07/15/spel-support-in-spring-data-jpa-query-definitions

答案 1 :(得分:19)

使用签名定义查询方法,如下所示。

@Query(select p from Person p where p.forename = :forename and p.surname = :surname)
User findByForenameAndSurname(@Param("surname") String lastname,
                             @Param("forename") String firstname);
}

有关详细信息,请查看the Spring Data JPA reference

答案 2 :(得分:10)

你想要的是不可能的。您必须创建两个参数,并将它们分开绑定:

select p from Person p where p.forename = :forename and p.surname = :surname
...
query.setParameter("forename", name.getForename());
query.setParameter("surname", name.getSurname());

答案 3 :(得分:6)

您可以尝试这样的事情:

public interface PersonRepository extends CrudRepository<Person, Long> {
       @Query("select p from Person AS p"
       + " ,Name AS n"  
       + " where p.forename = n.forename "
       + " and p.surname = n.surname"
       + " and n = :name")
       Set<Person>findByName(@Param("name") Name name);
    }

答案 4 :(得分:4)

您也可以使用接口默认方法解决它:

 @Query(select p from Person p where p.forename = :forename and p.surname = :surname)
User findByForenameAndSurname(@Param("surname") String lastname,
                         @Param("forename") String firstname);

default User findByName(Name name) {
  return findByForenameAndSurname(name.getLastname(), name.getFirstname());
}

当然,您仍然可以公开查看实际的存储库功能......

答案 5 :(得分:1)

您是否也在使用@Service?如果您是,那么您可以@Autowired PersonRepository @ServiceName,然后在服务中调用@Query(select p from Person p where p.forename = :forename and p.surname = :surname) User findByForenameAndSurname(@Param("surname") String lastname, @Param("forename") String firstname); } 类并使用@CuriosMind的表单...建议:

JDC!0320151104!03OUT 

当从服务中的存储库调用该方法时,您可以传递这些参数。

答案 6 :(得分:1)

如果我们使用JpaRepository,那么它将在内部创建查询。

示例

  

findByLastnameAndFirstname(String lastname,String firstname)

     

findByLastnameOrFirstname(String lastname,String firstname)

     

findByStartDateBetween(Date date1,Date2)

     

findById(int id)

注意

如果我们需要复杂的查询,那么我们需要编写像

这样的手动查询
@Query("SELECT salesOrder FROM SalesOrder salesOrder WHERE salesOrder.clientId=:clientId AND salesOrder.driver_username=:driver_username AND salesOrder.date>=:fdate AND salesOrder.date<=:tdate ")
 @Transactional(readOnly=true)
 List<SalesOrder> findAllSalesByDriver(@Param("clientId")Integer clientId, @Param("driver_username")String driver_username, @Param("fdate") Date fDate, @Param("tdate") Date tdate);

答案 7 :(得分:0)

Spring Data JPA 的简单性在于它尝试从存储库中的函数名称进行解释,而无需指定任何额外的 @Query 或 @Param 注释。 如果您要提供完整姓名,请尝试将其分解为名字和姓氏,然后使用类似这样的内容 -

HotelEntity findByName(String name);

My HotelEntity 确实包含字段 name,因此 JPA 尝试自行解释以推断我尝试查询的字段的名称并在内部创建后续查询。 来自 JPA 文档的更多证据 - enter image description here

更多详情 - here

答案 8 :(得分:-2)

    for using this, you can create a Repository for example this one:
    Member findByEmail(String email);

    List<Member> findByDate(Date date);
    // custom query example and return a member
   @Query("select m from Member m where m.username = :username and m.password=:password")
        Member findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);

答案 9 :(得分:-3)

 date;Movie1; ... ;Movie34
 2012-11-23 11:15:00;25.860000;26.010000
     .
     .
     .
 2012-11-21 12:15:00;25.860000;24.010000