春ブーツ(5):春ブーツJPAの使用

A、春ブーツJPAプロフィール

JPA(Javaの永続化API)は、Java日クラウン永続仕様です。これは、リレーショナルデータのJavaアプリケーションを管理するためのJava開発者/関連マッピングツールのオブジェクトを提供します。休止状態になりましたエンディング、独自のビジネスの状況にTopLinkの、JDOや他のORMフレームワークを、既存の永続ORM技術の開発と統合を簡素化するために主に表示されます。

注目すべきは、JPAは完全にORMに吸収され、使いやすい伸縮性と強力な利点は、既存の枠組みを発展しました。ビューの現在の開発コミュニティポイントの反応からは、JPAは春とEJBの開発チームを含め、素晴らしいサポートと賞賛されて。

注:JPAは、これらの製品は、このJPA仕様を達成するためなら、私たちは彼らの製品のJPAそれらを呼び出すことができ、彼らは製品です、Hibernateは、TopLinkのように、製品JDO、標準ではありません。

ブートJPAスプリングフレームワークに基づいてスプリングORMは、仕様JPA JPAアプリケーションフレームワークに基づいてパッケージは、開発者はデータベース操作へのアクセスを可能にするためにミニマリストとコードを使用することができます。これは、などCRUDを含め、一般的に使用される機能、および拡張が容易なを提供しています!学び、使用春ブーツJPAは大幅に開発効率を向上させることができます。

第二に、基本的なクエリ

基本的なクエリは、2つのタイプに分けることができ、1は1が自動的に法に基づいてクエリをSQLに解析され、春データのデフォルトが達成されたです。

図1に示すように、事前に生成する方法

春ブーツJPAは以前にいくつかの基本的なCRUDメソッドをデフォルトで生成しました。

(1)JpaRepositoryを継承

public interface UserRepository extends JpaRepository<User, Long> {
}

(2)デフォルトの方法を用いて

@Test
public void testBaseQuery() throws Exception {
	User user=new User();
	userRepository.findAll();
	userRepository.findOne(1l);
	userRepository.save(user);
	userRepository.delete(user);
	userRepository.count();
	userRepository.exists(1l);
	// ...
}

名前の意味を説明しません方法が見られます

2、カスタム単純なクエリ

カスタム単純なクエリが自動的にメソッド名に従ってSQLを生成することで、メインの文法

findXXBy、readAXXBy、queryXXBy、countXXBy、getXXByは、プロパティ名が続きます。

User findByUserName(String userName);

また、いくつかは、いくつかのキーワードを追加して、または使用

User findByUserNameOrEmail(String username, String email);

変更、削除、統計も同様の構文

Long deleteById(Long id);
Long countByUserName(String userName)

システム、実質的にSQLキーワードは、例えば、使用することができる:ignoreCaseは、[並べ替えのように。

List<User> findByEmailLike(String email);
User findByUserNameIgnoreCase(String userName);
List<User> findByUserNameOrderByEmailDesc(String email);

特定のキーワード、および使用方法は、SQLを生成し、次の

キーワード サンプル JPQLスニペット
そして findByLastnameAndFirstname ...どこx.lastname =?1とx.firstname =?2
若しくは findByLastnameOrFirstname ...どこx.lastname =?1またはx.firstname =?2
、等号であります findByFirstnameIs、findByFirstnameEquals ...どこx.firstname =?1
の間に findByStartDateBetween ...?1との間x.startDate?2
未満 findByAgeLessThan ...どこx.age <?1
LessThanEqual findByAgeLessThanEqual ... x.age⇐?1
演算子:GreaterThan findByAgeGreaterThan ...どこx.age>?1
GreaterThanEqual findByAgeGreaterThanEqual ...どこx.age> =?1
後に findByStartDateAfter ...どこx.startDate>?1
findByStartDateBefore ...どこx.startDate <?1
無効である findByAgeIsNull ... x.ageがnullであります
IsNotNull、NOTNULL findByAge(IS)NOTNULL ...どこx.ageないヌル
お気に入り findByFirstnameLike ...どこx.firstnameような?1
NotLike findByFirstnameNotLike ...どこx.firstnameないような?1
で始まります findByFirstnameStartingWith ...どこx.firstnameのような?1(追加%が結合したパラメータ)
EndingWith findByFirstnameEndingWith ...どこx.firstnameのような?1(プリペンド%が結合したパラメータ)
含みます findByFirstnameContaining ...どこx.firstname?1のような(%に包まれたパラメータバインド)
[並べ替え findByAgeOrderByLastnameDesc x.lastnameのDESCによって...どこx.age =?1件のオーダー
ではありません findByLastnameNot ... x.lastname <>?1
findByAgeIn(コレクション歳) ...どこx.age?1で
ありませんで findByAgeNotIn(コレクション歳) ...どこx.ageない?1で
TRUE findByActiveTrue() ... x.activeが真=
FALSE findByActiveFalse() ... x.activeが偽=
IGNORECASE findByFirstnameIgnoreCase ...どこUPPER(x.firstame)= UPPER(?1)

3、複雑なクエリ

実際の開発では、我々はなど、場合でも照会表、タブを使用する必要があり、削除の選択特別な方法やカスタムを必要とするSQL

4、ページングクエリ

実際の使用でクエリをページングすることは非常に一般的ですが、春ブーツJPAは、クエリメソッドでは、必要性がページング可能で、複数のクエリパラメータがあるとき、ページング可能に最後のパラメータとして推奨パラメータを渡すために、私たちは機能をページング達成支援してきました入ってきます。

Page<User> findALL(Pageable pageable);
Page<User> findByUserName(String userName,Pageable pageable);

春のタブは、ページング可能実装クラス、ページを使用する際に渡す必要、ページ番号と照合ストリップをカプセル化されています

@Test
public void testPageQuery() throws Exception {
	int page=1,size=10;
	Sort sort = new Sort(Direction.DESC, "id");
    Pageable pageable = new PageRequest(page, size, sort);
    userRepository.findALL(pageable);
    userRepository.findByUserName("testName", pageable);
}

5、クエリを制限

時々、私たちは最初のN個の要素をチェックする必要がある、またはエンティティが前に撤退します。

User findFirstByOrderByLastnameAsc();
User findTopByOrderByAgeDesc();
Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);
List<User> findFirst10ByLastname(String lastname, Sort sort);
List<User> findTop10ByLastname(String lastname, Pageable pageable);

6、カスタムSQLクエリ

実際には、ほとんどの春データスリープSQLは、メソッド名で定義された方法で達成することができ、私たちは、カスタムSQLクエリを使用するいくつかの理由で、春データも完璧なサポートです。@queryは、上記のSQLクエリメソッドを使用します注釈、削除、および@Modifyingも、クエリのタイムアウト設定に必要な@Transactionalもののためのサポートを追加することができます追加する必要性に関連するよう修正。

@Modifying
@Query("update User u set u.userName = ?1 where u.id = ?2")
int modifyByIdAndUserId(String  userName, Long id);
	
@Transactional
@Modifying
@Query("delete from User where id = ?1")
void deleteByUserId(Long id);
  
@Transactional(timeout = 10)
@Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);

7、マルチテーブルのクエリ

春ブーツJPAでのマルチテーブルクエリが最初に達成するために、Hibernateのクエリをカスケード接続を使用することがあり、二つの方法で実装され、第二にも、クエリ、第二の主要後の結果を受け取るために、結果セット・インターフェースを作成することです道。

インターフェースは、結果のセットを定義する必要があります。

public interface HotelSummary {

	City getCity();

	String getName();

	Double getAverageRating();

	default Integer getAverageRatingRounded() {
		return getAverageRating() == null ? null : (int) Math.round(getAverageRating());
	}

}

この方法は、新しく作成されたインターフェイスにクエリの種類を返します。

@Query("select h.city as city, h.name as name, avg(r.rating) as averageRating "
		- "from Hotel h left outer join h.reviews r where h.city = ?1 group by h")
Page<HotelSummary> findByCity(City city, Pageable pageable);

@Query("select h.name as name, avg(r.rating) as averageRating "
		- "from Hotel h left outer join h.reviews r  group by h")
Page<HotelSummary> findByCity(Pageable pageable);

使用

Page<HotelSummary> hotels = this.hotelRepository.findByCity(new PageRequest(0, 10, Direction.ASC, "name"));
for(HotelSummary summay:hotels){
		System.out.println("Name" +summay.getName());
	}

動作時にスプリングインタフェース(HotelSummary)自動的に取得することがgetxx凝集使用の形態におけるコードによって返された結果を受信するためにプロキシクラスを生成することになります。

第三に、複数のデータソースのサポート

図1に示すように、マルチソース・データベース・サポート相同

使用分散型開発モデルなどのアイテム、異なるサービスは、異なるデータソースを持って、多くの場合、プロジェクト内の複数のデータソースを使用する必要があるが、あなたが複数のデータソースの春データJPAの使用を設定する必要が毎日、通常3つの段階:

(1)設定し、複数のデータ・ソース

(2)異なる経路に異なるエンティティ・クラス・パケットの源

異なる(3)、パッケージパスを宣言トランザクションのサポートでさまざまなデータソース

図2に示すように、マルチソース異種データベースのサポート

例えば、我々はニーズがMySQLのサポートと予測するだけでなく、MongoDBのためなどで確認する必要があります。

エンティティクラス宣言@Entityリレーショナルデータベースのサポートタイプは、その上にさまざまなデータソースを使用して@DocumentのMongoDBサポートの種類、異なるエンティティを宣言されています

interface PersonRepository extends Repository<Person, Long> {}

@Entity
public class Person {}

interface UserRepository extends Repository<User, Long> {}

@Document
public class User {}

ユーザーはMongoDBのもそれを使用するMySQLユーザの両方を使用している場合しかし、あなたはミックスを行うことができます

interface JpaPersonRepository extends Repository<Person, Long> {}

interface MongoDBPersonRepository extends Repository<Person, Long> {}

@Entity
@Document
public class Person {}

このような使用のMySQLパッケージ路Aとしてパケットの異なる経路によって宣言されてもよく、Bは、パッケージパスのMongoDBを使用します

@EnableJpaRepositories(basePackages = "com.neo.repositories.jpa")
@EnableMongoRepositories(basePackages = "com.neo.repositories.mongo")
interface Configuration { }

列挙の使用

使用列挙、我々は、データベースは、対応する列挙型の文字列に格納したいの代わりにインデックス値の列挙で、あなたは(EnumType.STRING)上記のプロパティに@Enumerated追加する必要がありますコメント

@Enumerated(EnumType.STRING) 
@Column(nullable = true)
private UserType type;

第五に、必要とデータベースのマッピングプロパティはありません

通常の状況下で、我々はそれが私たちの一つは仲間のデータベースに必要としない場合でも、プロパティに関連するエンティティクラスとテーブルを作るだろう、エンティティクラスにコメントを追加し、ちょうど表示されたときに、唯一の両方@Transientプロパティを追加する必要がある計算を行う@Entityことができます。

@Transient
private String  userName;

 

コーヒーカップ、コードの行は、状態であり、追求です!

公開された110元の記事 ウォンの賞賛8 ビュー6905

おすすめ

転載: blog.csdn.net/guorui_java/article/details/104241662