±à¼ÍƼö: |
±¾ÎÄÖ÷ÒªÃèÊöÁËSpring
Boot³£ÓÃÅäÖÃÏ¿ª·¢³£ÓÃ×¢½â¡ª¡ª±í/ʵÌåÀà¡¢×Ö¶Î/ÓòʹÓã¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ° £¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
1. Spring Boot³£ÓÃÅäÖÃÏî
»ùÓÚSpring Boot 2.0.6.RELEASE
1.1 ÅäÖÃÊôÐÔÀà
spring.jpaǰ׺µÄÏà¹ØÅäÖÃÏÒåÔÚJpaPropertiesÀàÖУ¬
1.2 ×Ô¶¯×°ÅäÀà
Éæ¼°µ½µÄ×Ô¶¯ÅäÖÃÀà°üÀ¨£ºJpaBaseConfiguration£¬HibernateJpaAutoConfiguration
1.3 ³£ÓÃÅäÖÃÏî
# ÊÇ·ñ¿ªÆôJPA Repositories£¬È±Ê¡:
true
spring.data.jpa.repositories.enabled=true
# JPAÊý¾Ý¿âÀàÐÍ£¬Ä¬ÈÏ¿ÉÒÔ×Ô¶¯¼ì²â£¬Ò²ÄÜͨ¹ýÉèÖà spring.jpa.database-platform´ïµ½Í¬ÑùЧ¹û
spring.jpa.database=ORACLE
# Êý¾Ý¿âƽ̨£¬³£¼ûµÄÖµÈ磺
# org.hibernate.dialect.Oracle10gDialect
# org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.database-platform=org.hibernate.dialect.Oracle12cDialect
# ÊÇ·ñʹÓÃJPA³õʼ»¯Êý¾Ý¿â£¬¿ÉÒÔÔÚÆô¶¯Ê± Éú³ÉDDL´´½¨Êý¾Ý¿â±í£¬È±Ê¡Îªfalse
spring.jpa.generate-ddl = false
# ¸üϸÁ£¶ÈµÄ¿ØÖÆJPA³õʼ»¯Êý¾Ý¿âÌØÐÔ£¬ ÓÃÀ´É趨Æô¶¯Ê±DDL²Ù×÷µÄÀàÐÍ£¬ÏÂÎÄÓÐÏêϸ½éÉÜ
# ÄÚǶÊý¾Ý¿â hsqldb, h2, derbyµÄȱʡֵΪcreate-drop
# ·ÇÄÚǶÊý¾Ý¿âµÄȱʡֵΪnone
spring.jpa.hibernate.ddl-auto = update
# Hibernate²Ù×÷ʱÏÔÊ¾ÕæÊµµÄSQL, ȱʡ£ºfalse
spring.jpa.show-sql = true
# Hibernate 5 Òþº¬ÃüÃû²ßÂÔÀàµÄÈ«ÏÞ¶¨Ãû
spring.jpa.hibernate.naming.implicit-strategy=
# Hibernate 5 ÎïÀíÃüÃû²ßÂÔÀàµÄÈ«ÏÞ¶¨Ãû
spring.jpa.hibernate.naming.physical-strategy=org. hibernate.boot.model.naming. PhysicalNamingStrategyStandardImpl
# Use Hibernate's newer IdentifierGenerator
for AUTO, TABLE and SEQUENCE.
spring.jpa.hibernate.use-new-id-generator-mappings=
# ¶îÍâÉèÖÃJPAÅäÖÃÊôÐÔ£¬Í¨³£ÅäÖÃÏîÊÇÌØ¶¨ÊµÏÖ Ö§³ÖµÄ£¬ÈçHibernate³£ÓÐÏÂÃæµÄ¼¸ÌõÅäÖÃÏî
spring.jpa.properties.* =
# ½«SQLÖеıêʶ·û£¨±íÃû£¬ÁÐÃûµÈ£©È«²¿Ê¹ÓÃÒýºÅÀ¨ÆðÀ´
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
# ÈÕÖ¾¼Ç¼ִÐеÄSQL
spring.jpa.properties.hibernate.show_sql = true
# ÊÇ·ñ½«¸ñʽ»¯SQLÈÕÖ¾
spring.jpa.properties.hibernate.format_sql =
true
# ÊÇ·ñ×¢²áOpenEntityManagerInViewInterceptor. °ó¶¨JPA
EntityManager µ½ÇëÇóÏß³ÌÖÐ. ĬÈÏΪ: true.
spring.jpa.open-in-view=true
# Hibernate 4 ÃüÃû²ßÂÔµÄÈ«ÀàÃû£¬Hibernate 5²»ÔÙÊÊÓÃ
spring.jpa.hibernate.naming-strategy= |
1.4 ÅäÖÃÏî spring.jpa.database
ÅäÖÃÏîspring.jpa.databaseµÄֵͨ³£¿ÉÒÔ×Ô¶¯¼ì²â£¬¿Éȡֵ°üÀ¨ÁË£º
public enum Database
{
DEFAULT,
DB2,
DERBY,
H2,
HSQL,
INFORMIX,
MYSQL,
ORACLE,
POSTGRESQL,
SQL_SERVER,
SYBASE
} |
1.5 ÅäÖÃÏîspring.jpa.generate-ddl ºÍ spring.jpa.hibernate.ddl-auto
ÅäÖÃÏîspring.jpa.generate-ddl¹ÜÀíÊÇ·ñ¿ªÆô×Ô¶¯³õʼ»¯SchemaÌØÐÔ£¬
ÅäÖÃÏîspring.jpa.hibernate.ddl-auto ½øÒ»²½¿ØÖÆÆô¶¯Ê±³õʼ»¯SchemaµÄÌØÐÔ£¬ÓÐÒÔÏ¿Éѡֵ£º
create, Æô¶¯Ê±É¾³ýÉÏÒ»´ÎÉú³ÉµÄ±í£¬²¢¸ù¾ÝʵÌåÀàÉú³É±í£¬±íÖеÄÊý¾Ý½«±»Çå¿Õ£»
create-drop£¬Æô¶¯Ê±¸ù¾ÝʵÌåÀàÉú³É±í£¬sessionFactory¹Ø±Õʱɾ³ý±í£»
update£¬Æô¶¯Ê±¸ù¾ÝʵÌåÀàÉú³É±í£¬µ±ÊµÌåµÄÊôÐԱ䶯ʱ£¬±í½á¹¹Ò²»á¸üУ¬¿ª·¢½×¶Î¿ÉÒÔʹÓøÃÊôÐÔ£»
validate£¬Æô¶¯Ê±Ñé֤ʵÌåÀàºÍÊý¾Ý±íÊÇ·ñÒ»Ö£¬ÔÚÊý¾Ý½á¹¹Îȶ¨Ê±¿ÉÒÔ²ÉÈ¡¸ÃÑ¡Ï
none£¬²»²ÉÈ¡ÈκβÙ×÷£»
1.6 ÅäÖÃÏîhibernate.globally_quoted_identifiers
ÅäÖÃÏîhibernate.globally_quoted_identifiersÓÃÀ´ÔÚSQLÖмÓÈëÒýºÅ£¬ÒÔ½â¾öijЩ³¡¾°ÖÐSQL±êʶ·û£¨±íÃû£¬ÁÐÃûµÈ£©³öÏÖÁËÊý¾Ý¿â¹Ø¼ü×ÖµÄÇéÐΡ£
OracleÖУ¬¸ÃÊôÐÔ¸ø±êʶ·û¼ÓË«ÒýºÅ£¬×¢ÒâOracleË«ÒýºÅÖеÄÄÚÈÝÇø·Ö´óСд£»
MySQLÖУ¬¸ÃÊôÐÔ¸ø±êʶ·û¼Ó·´ÒýºÅ£¨Ã»´í£¬¾ÍÊǼüÅÌÊý×Ö1×óÃæµÄÄǸö`£©£¬×¢ÒâĬÈÏÇé¿öÏ£¬MySQLµÄ±íÃûÇø·Ö´óСд£¬µ«ÁÐÃû²»Çø·Ö´óСд£¬ÔÚ·´ÒýºÅÖÐÒ²ÊÇÈç´Ë¡£
2. ¿ª·¢³£ÓÃ×¢½â¡ª¡ª±í/ʵÌåÀàʹÓÃ
2.1 @Entity
@EntityÓÃÔÚʵÌåÀàÉÏ£¬±íʾÕâÊÇÒ»¸öºÍÊý¾Ý¿â±íÓ³ÉäµÄʵÌåÀà¡£
2.2 @Table
@TableÓÃÀ´ÉùÃ÷ʵÌåÀà¶ÔÓ¦µÄ±íÐÅÏ¢¡£°üÀ¨±íÃû³Æ¡¢Ë÷ÒýµÈ¡£
2.3 @SQLDelete£¬
@SQLDeleteÓÃÀ´×Ô¶¨Òåɾ³ýÓï¾ä£¬
Èç¹û²»ÏëʹÓÃJPA Repository×Ô´øµÄɾ³ýÓï¾ä£¬¾Í¿ÉÒÔʹÓøÃ×¢½âÖØÐ´£¬Èç³£¼ûµÄÈíɾ³ý£º
@Entity
@Table(name = "App")
@SQLDelete(sql = "Update App set isDeleted
= 1 where id = ?") |
@WhereÓÃÀ´Ö¸¶¨Ä¬ÈϲéѯÌõ¼þ£¬¿ÉÒÔÓÃÀ´ÅäºÏÈíɾ³ý¡£
@Entity
@Table(name = "App")
@SQLDelete(sql = "Update App set isDeleted
= 1 where id = ?")
@Where(clause = "isDeleted = 0") |
2.4 @MappedSuperclass
@MappedSuperclassÓÃÀ´¶¨ÒåÈô¸É±íÖй«¹²µÄ×ֶΣ¬½«ËüÃÇ·â×°ÔÚÒ»¸ö»ùÀàÖУ¬»ùÀàÉÏʹÓøÃ×¢½â£¬ÔòÆä×ÓʵÌåÀཫ×Ô¶¯»ñµÃ¸¸ÀàÖеÄ×Ö¶ÎÓ³Éä¹ØÏµ£¬Í¬Ê±²»ÐèÒª¶îÍâΪ¸¸ÀཨÁ¢ÕæÊµµÄ±í£¬Ò²¾ÍÊÇÕæÕýµÄ±íÖ»¶ÔÓ¦@MappedSuperclassµÄ×ÓÀà¡£
2.5 @Inheritance
@MappedSuperclassÖ¸¶¨ÁËʵÌåÀàÖ®¼äÊÇ¿ÉÒÔ´æÔÚ²ã´Î¹ØÏµµÄ£¬Í¨¹ý@Inheritance¿ÉÒÔ½øÒ»²½¹ÜÀí²ã´Î¹ØÏµ£¬ÆäȡֵInheritanceTypeÓÐÒÔÏÂö¾Ù±äÁ¿£º
public enum InheritanceType
{
/** A single table per class hierarchy. */
SINGLE_TABLE,
/** A table per concrete entity class. */
TABLE_PER_CLASS,
/**
* A strategy in which fields that are specific
to a
* subclass are mapped to a separate table than
the fields
* that are common to the parent class, and a
join is
* performed to instantiate the subclass.
*/
JOINED
} |
ÀýÈç
¸¸ÀàÉùÃ÷ÈçÏ£¬Òâζ×Åÿ¸ö×ÓʵÌåÀà¶ÔÓ¦ÁËÒ»Õűí
@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class BaseEntity |
×ÓʵÌåÀิÓø¸ÀàÉùÃ÷µÄÓò/×ֶΣº
@Entity
@Table(name="App")
public class AppEntity entends BaseEntity |
3. ¿ª·¢³£ÓÃ×¢½â¡ª¡ª×Ö¶Î/ÓòʹÓÃ
3.1 @Column
@ColumnÉùÃ÷Ò»¸ö±í×Ö¶ÎÓëÓò/·½·¨µÄÓ³É䣬ÆäÊôÐÔ¿ÉÒÔ½øÒ»²½Ö¸¶¨ÊÇ·ñ¿ÉΪNULL£¬ÊÇ·ñΨһµÈϸ½Ú¡£
3.2 @Id
@Id±ê×¢Ò»¸öÊôÐÔ£¬±íʾ¸ÃÊôÐÔÓ³ÉäΪÊý¾Ý¿âµÄÖ÷¼ü¡£
µ¥¶ÀʹÓÃ@IdÀ´±êʶʵÌåÀàµÄµ¥¸öÓòÓ³ÉäΪÊý¾Ý¿â±íµÄÖ÷¼ü£¬¶ÔÓÚÁªºÏÖ÷¼ü¶øÑÔ£¬¾ÍÒªÅäºÏ@IdClassʹÓá£
¶¨ÒåÒ»¸ö£¨Íⲿ£©Ö÷¼üÀ࣬Ö÷¼üÀàÖÐÉùÃ÷ÁËʵÌåÀࣨĿ±ê±í£©ÁªºÏÖ÷¼üÖеÄËùÓÐÖ÷ÊôÐÔ£¬Ö÷¼üÀàÐèʵÏÖSerializable½Ó¿Ú£»
ÔÚÕæÕýµÄʵÌåÀàÉÏʹÓÃ@IdClass£¬ÒÔÉÏÒ»²½¶¨ÒåµÄÖ÷¼üÀà×÷Ϊ²ÎÊý£»
ʵÌåÀàµÄÖ÷ÊôÐÔ±ØÐëºÍÖ÷¼üÀàÖеÄÖ÷ÊôÐÔÍêÈ«¶ÔÓ¦£¨¸öÊý£¬ÀàÐÍ£¬Ãû³Æ£©;
ÔÚʵÌåÀàµÄËùÓÐÖ÷ÊôÐÔÉÏÃæÌí¼Ó@Id×¢½â£»
ʾÀý
ÍⲿÖ÷¼üÀࣺ
public class
RoleUserId implements Serializable {
private Long roleId;
private Long userId;
} |
ʵÌåÀࣺ
@Entity
@Table(name = "TB_ROLE_USER")
@IdClass(RoleUserId.class)
public class RoleUserDO {
@Id
private Long roleId;
@Id
private Long userId;
// ...
} |
3.3 @GeneratedValue
@GeneratedValueÉèÖÃ×ֶεÄ×Ô¶¯Éú³É·½Ê½¡£
ÆästrategyÊôÐÔȡֵΪö¾ÙGenerationType£º
/**
* Indicates that the persistence provider must
assign
* primary keys for the entity using an underlying
* database table to ensure uniqueness.
*/
TABLE,
/**
* Indicates that the persistence provider must
assign
* primary keys for the entity using a database
sequence.
*/
SEQUENCE,
/**
* Indicates that the persistence provider must
assign
* primary keys for the entity using a database
identity column.
*/
IDENTITY,
/**
* Indicates that the persistence provider should
pick an
* appropriate strategy for the particular database.
The
* <code>AUTO</code> generation strategy
may expect a database
* resource to exist, or it may attempt to create
one. A vendor
* may provide documentation on how to create
such resources
* in the event that it does not support schema
generation
* or cannot create the schema resource at runtime.
*/
AUTO |
ʹÓÃ×ÔÔöµÄÊý¾Ý¿âÁÐÉú³ÉÖ÷¼üÊÇÒ»ÖÖ³£¼ûµÄÖ÷¼üÉú³É·½Ê½£¬MySQLÖ§³ÖIdentityÁС£
Oracle 12cÒÔºóÖ§³ÖIdentity Column£¨Éí·ÝÁУ©£¬¿ÉÒÔʹÓÃGenerationType.IDENTITY×÷ΪÉú³É²ßÂÔ£¬´ËʱÎÞÐèÔÙʹÓÃ@SequenceGeneratorÖ¸¶¨¶ÔÓ¦ÐòÁС£´ËǰµÄOracleͨ³£Ê¹ÓÃÐòÁÐʵÏÖ×ÔÔö×ֶΣ¬ÐèÒª½«Éú³É²ßÂÔÖ¸¶¨ÎªGenerationType.SEQUENCE²¢ÅäºÏ@SequenceGenerator£¨ÏÂÎÄ£©Ê¹Óá£
Oracle 12cÐÂÔöIdentity ColumnµÄʹÓÃÇëÔĶÁ£ºhttps://www.cnblogs.com/zyon/p/11067115.html
ʹÓÃÉí·ÝÁÐÉú³É×ÔÔöÖ÷¼üʱ£¬ÔÚÖ÷¼üÊôÐÔÉÏʹÓÃ@IdºÍ@GeneratedValue(strategy
= GenerationType.IDENTITY)
@Entity
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false,
nullable = false)
private Long id;
// ¡
} |
@GeneratedValue#generatorÊôÐÔÖ¸¶¨Ö÷¼üÉú³ÉÆ÷µÄÃû³Æ£¬ÐèÒªÓë@SequenceGenerator»ò@TableGeneratorµÄÃû³Æ¶ÔÓ¦ÆðÀ´¡£
3.4 @SequenceGenerator
Èç¹ûʹÓÃÐòÁз½Ê½Éú³ÉÖ÷¼ü£¬@SequenceGeneratorÖ¸¶¨×Ô¶¯Éú³ÉÖ÷¼üʱ¶ÔÓ¦µÄÐòÁУ¨Sequence£©¡£
@SequenceGenerator#nameÖ¸¶¨ÐòÁÐÉú³ÉÆ÷µÄÃû³Æ£¬@GeneratedValue#generatorͨ¹ýÒýÓøÃÖµÓë¾ßÌåµÄÐòÁÐÉú³ÉÆ÷¹ØÁª£¬½ø¶ø¹ØÁª¾ßÌåµÄÐòÁС£
@SequenceGenerator#sequenceNameÖ¸¶¨×Ô¶¯Éú³ÉÖ÷¼üʱµÄÎïÀíÐòÁÐÃû³Æ£»
@SequenceGenerator#initialValueÊôÐÔÖ¸¶¨ÐòÁгõÖµ£»
@SequenceGenerator#allocationSizeÖ¸¶¨×ÔÔö²½³¤£»
ʵÀý£º
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "sequence")
@SequenceGenerator(name = "sequence",
sequenceName = "ID_SEQ", allocationSize
= 1)
@Column(name = "Id")
private long id; |
3.5 JPA´ó¶ÔÏóÖ§³Ö
³£ÓÃÏà¹Ø×¢½â
@Lob
@Basic
3.5.1 ÔÚ×Ö·û´®ÐÍÓòÉÏÓÃ@Lob
@Lob
private String description; |
oracleÓ³Éä×ֶεÄÀàÐÍÊÇCLOB£¬java.sql.Clob, Character[], char[]
ºÍ java.lang.String ½«±»³Ö¾Ã»¯Îª Clob ÀàÐÍ¡£
mysqlÖÐÓ³Éä×ֶεÄÀàÐÍÊÇlongtext¡£
3.5.2 ÔÚ¶þ½øÖƵÈÀàÐÍÓòÉÏÓÃ@Lob
oracleÖÐjava.sql.Blob, Byte[], byte[] ºÍ SerializableʵÏÖÀཫ±»³Ö¾Ã»¯Îª
Blob ÀàÐÍ¡£
mysqlÖжÔÓ¦longblob¡£
@Lob³Ö¾Ã»¯ÎªBlob»òÕßClobÀàÐÍ,¸ù¾Ýget·½·¨µÄ·µ»ØÖµ²»Í¬£¬×Ô¶¯½øÐÐClobºÍBlobµÄת»»¡£
3.5.3 ´ó¶ÔÏó×ֶεÄÑÓ³Ù¼ÓÔØ
@Lob
@Basic(fetch=FetchType.LAZY)
private Byte[] file; |
ÒòΪ´ó¶ÔÏóÊý¾ÝÒ»°ãÕ¼ÓõÄÄÚ´æ¿Õ¼ä±È½Ï´ó£¬ËùÒÔͨ³£Ê¹ÓÃÑÓ³Ù¼ÓÔØµÄ·½Ê½£º@Basic×¢½âÉèÖüÓÔØ·½Ê½ÎªFetchType.LAZY¡£
ÎÊÌ⣺
ÑÓ³Ù¼ÓÔØÊÇÑÓ³Ùµ½Ê²Ã´Ê±ºò£¿Õâ¸öÎÊÌâһֱûÓÐÕÒµ½È·ÇеĽâ´ð¡£
4. ³£ÓÃRepository¿ª·¢
4.1 Repository½Ó¿Ú
public interface
Repository<T, ID> |
×î»ù´¡µÄRepository½Ó¿Ú£¬²»ÌṩÈκβÙ×÷·½·¨¡£
4.2 CrudRepository½Ó¿Ú
public interface
CrudRepository<T, ID> extends Repository<T,
ID> |
ÌṩCRUD»ù±¾²Ù×÷µÄRepository½Ó¿Ú¡£
4.3 PagingAndSortingRepository ½Ó¿Ú
public interface
PagingAndSortingRepository<T, ID> extends
CrudRepository<T, ID> |
Ëü¼Ì³Ð CrudRepository ½Ó¿Ú£¬ÔÚ CrudRepository »ù´¡ÉÏÐÂÔöÁËÁ½¸öÓë·ÖÒ³Óйصķ½·¨¡£
Ò²¿ÉÒÔ²»½«×Ô¶¨ÒåµÄ³Ö¾Ã²ã½Ó¿ÚÖ±½Ó¼Ì³ÐPagingAndSortingRepository£¬¶øÊǼ̳Ð
Repository »ò CrudRepository µÄ»ù´¡ÉÏ£¬ÔÚ×Ô¶¨Òå·½·¨²ÎÊýÁбí×îºóÔö¼ÓÒ»¸ö
Pageable »ò Sort ÀàÐ͵IJÎÊý£¬ÓÃÓÚÖ¸¶¨·ÖÒ³»òÅÅÐòÐÅÏ¢£¬¿ÉÒÔʵÏÖ±ÈÖ±½Ó¼Ì³Ð PagingAndSortingRepository
¸ü´óµÄÁé»îÐÔ¡£
4.4 JpaRepository½Ó¿Ú
public interface
JpaRepository<T, ID> extends PagingAndSortingRepository<T,
ID>, QueryByExampleExecutor<T> |
JpaRepository ¼Ì³ÐPagingAndSortingRepository£¬ÊÇÕë¶Ô JPA
¼¼ÊõÌṩµÄ½Ó¿Ú£¬ËüÔÚ¸¸½Ó¿ÚµÄ»ù´¡ÉÏ£¬ÌṩÁËÆäËûһЩ·½·¨£¬±ÈÈçflush()£¬saveAndFlush()£¬deleteInBatch()
µÈ¡£
4.5 ×Ô¶¨ÒåJPA Repository·½·¨
×Ô¶¨ÒåJPA Repository·½·¨£¬Ó¦²Î¿¼ÒÔϹ淶£º

×¢ÒâÁ½µã£º
³öÏÖÔÚ·½·¨ÃûÖÐÓÃÓÚ×éºÏ²éѯÌõ¼þµÈµÄÊÇʵÌåÀàµÄÓòÃû³Æ£¬¶ø²»ÊÇÊý¾Ý¿âµÄ±í×ֶΣ»
ÕâÖÖ·½Ê½ÓÃÀ´×éºÏһЩ¹Ì¶¨Ä£Ê½µÄSQL£¬Éú³ÉSQLµÄ¹ý³Ì¶Ô³ÌÐòÔ±ÊÇ͸Ã÷µÄ£¬³ÌÐòÔ±²»ÓÃ×Ô¼ºÐ´SQL¡£
4.6 @Query×¢½â
org.springframework.data.jpa.repository.Query×¢½âÓÃÀ´Ö¸¶¨JPA
Repository·½·¨¶ÔÓ¦µÄ²éѯHSQL¡£
ʾÀý£º
import org.springframework.data.repository.query.Param;
//...
@Query("select a from App a where a.name
LIKE %:name%")
List<App> findByName(@Param("name")
String name); |
ÐèҪעÒâµÄÊÇ£¬@QueryÖеIJÎÊýHQLĬÈϲ»ÊÇÕæÊµµÄSQLÓï¾ä£¬¶øÊÇÃæÏò¶ÔÏóµÄ¡£
ͨ³£ÎÒÃÇ¿ÉÒÔʹÓÃ@TableÖ¸¶¨ÊµÌåÀà¶ÔÓ¦µÄ±íÃû£¬Èç¹ûʵÌåÀàµÄÀàÃûºÍ¶ÔÓ¦µÄ±íÃû²»Í¬£¬@QueryÖÐÓ¦¸ÃʹÓÃÀàÃû£¬Í¬Ê±²ÎÊýHQLÖÐʹÓõÄÊÇʵÌåÀàµÄÓòÃû³Æ¶ø²»ÊÇʵ¼ÊµÄ×Ö¶ÎÃû¡£
Èç²»ÕâÑù£¬ÀýÈçÔÚ@QueryµÄ²ÎÊýHQLÖÐʹÓÃÁËʵ¼ÊµÄ±íÃû¶ø·ÇʵÌåÀàÃû£¬Ôò»á±¨£ºQuerySyntaxException:
XXX is not mapped.¡£
Èç¹ûÏ£ÍûʹÓÃÔÉúSQL£¬½«@Query#nativeQueryÉèÖÃΪtrue¼´¿É£º
@Query(nativeQuery
= true, value = "SELECT * FROM AUTH_USER
WHERE name = :name1 OR name = :name2 ")
List<UserDO> findSQL(@Param("name1")
String name1, @Param("name2") String
name2); |
4.7 @Modifying×¢½â
org.springframework.data.jpa.repository.Modifying×¢½â±êʶһ¸öJPA
Repository·½·¨¶ÔÓ¦µÄSQL»áÐÞ¸ÄÊý¾Ý¿â¡£
ʾÀý£º
@Modifying
@Query("update appnamespace set isDeleted=1,
dataChangeLastModifiedBy = ?3 where appId = ?1
and name = ?2")
int delete(String appId, String namespaceName,
String operator); |
|