Query methods & Query creation

findByFooAndBarのようなことをクエリを作成さずに利用できる

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation

Anootation

参考 : http://etc9.hatenablog.com/entry/20090830/1251606823

@Entity

@Entityは該当のクラスがエンティティであることを指定

@Id

primary Key

@Table

dbのテーブル名とentityのクラス名が違う場合

@Table(name="CUST", schema="RECORDS")
@Table(name="CUST")

@GeneratedValue

@Idの指定した primary keyの採番方法を指定

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() { return id; }

strategy

  • GenerationTypeを利用
    • AUTO
    • IDENTITY
    • SEQUENCE
    • TABLE
  • customでstrategyを作ることもできる

@Column

カラム属性を指定します。プロパティかフィールドに指定します。

@Entity
public class Customer {
    @Column(name = "first_name", nullable = false, length = 30)
    public String getFirstname(){ return firstname };

@Transient

  • 永続化対象外とするプロパティやフィールド
    • テーブルとマッピングされないカラム

@MappedSuperclass

  • @MappedSuperclassを付けないと、BaseEntity の id は永続化されません。
@MappedSuperclass
public abstract class BaseEntity {
  @Id protected Long id;
  // ・・・
}

@Entity
public class Customer extends BaseEntity {
  public String name;
  // ・・・
}

@Enumerated

@Enumerated(EnumType.String)
private HogeEnum hoge;

@Temporal

  • http://itdoc.hitachi.co.jp/manuals/link/cosmi_v0870/APR4/EU260113.HTM
  • http://javabeat.net/jpa-annotations-temporal/
  • 時刻を表す型(java.util.Dateおよびjava.util.Calendar)を持つ永続化プロパティまたは永続化フィールドに指定するアノテーションです。@Basicとともに使用できます。
  • ただし,@Versionと@Temporalは同時に指定できません。どちらかのアノテーションだけを指定してください。適用可能要素は,メソッドとフィールドです。

  • TemporalType.DATE:java.sql.Dataと同じです。

  • TemporalType.TIME:java.sql.Timeと同じです。
  • TemporalType.TIMESTAMP:java.sql.Timestampと同じです。

@Convert

enum convertの例

@Converter(autoApply = true)
public class VehicleConverter implements AttributeConverter<Vehicle, String> {

 @Override
 public String convertToDatabaseColumn(Vehicle vehicle) {
  switch (vehicle) {
  case BUS:
   return "B";
  case CAR:
   return "C";
  case PLANE:
   return "P";
  case TRAIN:
   return "T";
  default:
   throw new IllegalArgumentException("Unknown value: " + vehicle);
  }
 }

 @Override
 public Vehicle convertToEntityAttribute(String dbData) {
  switch (dbData) {
  case "B":
   return Vehicle.BUS;
  case "C":
   return Vehicle.CAR;
  case "P":
   return Vehicle.PLANE;
  case "T":
   return Vehicle.TRAIN;
  default:
   throw new IllegalArgumentException("Unknown value: " + dbData);
  }
 }

}

@PrePersist and @PreUpdate

  • @EntityListeners(TimeStampListener.class)のようにListenersを作ってそれで作る方法
  • または Entity classなかで @PrePersist and @PreUpdateを実装してもいい
public class YourEntityClass {
  ...
    private Date creationTime;
    private Date modificationTime;

    @PrePersist
    public void prePersist() {
        Date now = Date();
        this.creationTime = now;
        this.modificationTime = now;
    }

    @PreUpdate
    public void preUpdate() {
        this.modificationTime = Date();
    }
}

@PrePersist

@PreUpdate

@Version

  • JPAの楽観ロックを使うため

以下のようなsqlが発行される

where id=?
and version=?

CookBook

How to map a string to DB sequence in Hibernate - String primaryを作る方法

http://stackoverflow.com/questions/12517421/how-to-map-a-string-to-db-sequence-in-hibernate

import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.id.IdentifierGenerator;

public class StringKeyGenerator implements IdentifierGenerator {

    @Override
    public Serializable generate(SessionImplementor session, Object collection) throws HibernateException {
        Connection connection = session.connection();
        PreparedStatement ps = null;
        String result = "";

        try {
            // Oracle-specific code to query a sequence
            ps = connection.prepareStatement("SELECT TABLE_SEQ.nextval AS TABLE_PK FROM dual");
            ResultSet rs = ps.executeQuery();

            if (rs.next()) {
                int pk = rs.getInt("TABLE_PK");

                // Convert to a String
                result = Integer.toString(pk);
            }
        } catch (SQLException e) {
            throw new HibernateException("Unable to generate Primary Key");
        } finally {
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    throw new HibernateException("Unable to close prepared statement.");
                }
            }
        }

        return result;
    }
}
@Id
@GenericGenerator(name="seq_id", strategy="my.package.StringKeyGenerator")
@GeneratedValue(generator="seq_id")
@Column(name = "TABLE_PK", unique = true, nullable = false, length = 20)
public String getId() {
    return this.id;
}
  1. @GenericGeneratorでつかう strategyクラスを作成
  2. @GenericGenerator登録
  3. @GeneratedValuegenerator@GenericGeneratorのnameを入れる

entity save

save & flush & saveAndFlush

Spring Data JPA の Specificationでらくらく動的クエリ

http://qiita.com/tag1216/items/3a408d2751a6310e2948

Specification を使用するには、先ず Repositoryインターフェイスを JpaSpecificationExecutor を継承した形にする。

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
}

References

results matching ""

    No results matching ""