94

入力パラメータのプロパティをクエリパラメータとして使用する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);
}

?1...しかし、Spring data / JPAは、パラメーターにプロパティ名を指定することを好みません。

最も近い代替案は何ですか?

4

10 に答える 10

203

このリンクは次のことに役立ちます。SpEL式がサポートされているSpringDataJPAM1。同様の例は次のようになります。

@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

于 2015-03-11T17:48:30.203 に答える
23

次のように、シグネチャを使用してクエリメソッドを定義します。

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

詳細については、SpringDataJPAリファレンスを確認してください。

于 2014-06-02T05:42:38.087 に答える
10

あなたが望むことは不可能です。2つのパラメーターを作成し、それらを別々にバインドする必要があります。

select p from Person p where p.forename = :forename and p.surname = :surname
...
query.setParameter("forename", name.getForename());
query.setParameter("surname", name.getSurname());
于 2012-05-29T17:14:45.107 に答える
9

インターフェイスのデフォルトメソッドを使用して解決することもできます。

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

もちろん、実際のリポジトリ関数はまだ公開されています...

于 2017-12-22T11:47:22.793 に答える
8

あなたはこのようなことを試すことができます:

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);
    }
于 2015-11-13T16:04:12.490 に答える
2

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);
于 2017-09-25T08:55:38.030 に答える
1

あなたも一緒に働いてい@Serviceますか?もしそうなら、あなたは@AutowiredあなたPersonRepositoryをすることができ、それから@ServiceサービスでNameクラスを呼び出して@CuriosMind...が提案したフォームを使うことができます:

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

そして、サービスのリポジトリからメソッドを呼び出すときに、それらのパラメーターを渡すことができます。

于 2016-05-10T20:30:11.807 に答える
0

Spring Data JPAの単純さは、追加の@Queryまたは@Paramアノテーションを指定せずに、リポジトリ内の関数の名前から解釈しようとすることです。完全な名前を指定する場合は、名と姓に分類してから、次のように使用してください-

HotelEntity findByName(String name);

私のHotelEntityにはフィールド名が含まれているため、JPAは独自に解釈して、クエリしようとしているフィールドの名前を推測し、内部で後続のクエリを作成しようとします。JPAドキュメントからのいくつかの証拠- ここに画像の説明を入力してください

詳細-こちら

于 2021-05-16T03:09:51.467 に答える
-3
    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);
于 2018-05-20T22:03:03.750 に答える
-5
@Autowired
private EntityManager entityManager;

@RequestMapping("/authors/{fname}/{lname}")
    public List actionAutherMulti(@PathVariable("fname") String fname, @PathVariable("lname") String lname) {
        return entityManager.createQuery("select A from Auther A WHERE A.firstName = ?1 AND A.lastName=?2")
                .setParameter(1, fname)
                .setParameter(2, lname)
                .getResultList();
    }
于 2017-11-04T09:40:35.650 に答える