spring boot jpa 查询无主键的视图
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
< project xmlns = " http://maven.apache.org/POM/4.0.0" xmlns: xsi= " http://www.w3.org/2001/XMLSchema-instance"
xsi: schemaLocation= " http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" >
< modelVersion> 4.0.0</ modelVersion>
< parent>
< groupId> org.springframework.boot</ groupId>
< artifactId> spring-boot-starter-parent</ artifactId>
< version> 2.1.3.RELEASE</ version>
< relativePath/>
</ parent>
< groupId> com.company</ groupId>
< artifactId> demostaff</ artifactId>
< version> 0.0.1-SNAPSHOT</ version>
< name> demostaff</ name>
< description> Demo project for Spring Boot</ description>
< properties>
< java.version> 1.8</ java.version>
</ properties>
< dependencies>
< dependency>
< groupId> org.springframework.boot</ groupId>
< artifactId> spring-boot-starter</ artifactId>
< exclusions>
< exclusion>
< groupId> org.springframework.boot</ groupId>
< artifactId> spring-boot-starter-logging</ artifactId>
</ exclusion>
</ exclusions>
</ dependency>
< dependency>
< groupId> org.springframework.boot</ groupId>
< artifactId> spring-boot-starter-log4j2</ artifactId>
</ dependency>
< dependency>
< groupId> log4j</ groupId>
< artifactId> log4j</ artifactId>
< version> 1.2.15</ version>
</ dependency>
< dependency>
< groupId> com.lmax</ groupId>
< artifactId> disruptor</ artifactId>
< version> 3.4.2</ version>
</ dependency>
< dependency>
< groupId> com.sun.xml.bind</ groupId>
< artifactId> jaxb-impl</ artifactId>
< version> 2.2.3-1</ version>
</ dependency>
< dependency>
< groupId> org.springframework.boot</ groupId>
< artifactId> spring-boot-starter-data-jpa</ artifactId>
</ dependency>
< dependency>
< groupId> org.springframework.boot</ groupId>
< artifactId> spring-boot-starter-jdbc</ artifactId>
</ dependency>
< dependency>
< groupId> org.postgresql</ groupId>
< artifactId> postgresql</ artifactId>
< scope> runtime</ scope>
</ dependency>
< dependency>
< groupId> org.projectlombok</ groupId>
< artifactId> lombok</ artifactId>
< optional> true</ optional>
</ dependency>
< dependency>
< groupId> org.springframework.boot</ groupId>
< artifactId> spring-boot-starter-test</ artifactId>
< scope> test</ scope>
</ dependency>
< dependency>
< groupId> com.alibaba</ groupId>
< artifactId> druid</ artifactId>
< version> 1.1.10</ version>
</ dependency>
</ dependencies>
< build>
< plugins>
< plugin>
< groupId> org.springframework.boot</ groupId>
< artifactId> spring-boot-maven-plugin</ artifactId>
</ plugin>
</ plugins>
</ build>
</ project>
application.properties
spring.datasource.url= jdbc:postgresql://10.96.32.40:7017/isfd_isfddb?useUnicode= true& characterEncoding= utf-8& serverTimezone= UTC& useSSL= true
spring.datasource.username= user_oa
spring.datasource.password= Flzx3qc
spring.datasource.driver-class-name= org.postgresql.Driver
spring.datasource.initialSize= 5
spring.datasource.minIdle= 5
spring.datasource.maxActive= 20
spring.datasource.maxWait= 60000
spring.datasource.timeBetweenEvictionRunsMillis= 60000
spring.datasource.minEvictableIdleTimeMillis= 300000
spring.datasource.validationQuery= select version( )
spring.datasource.testWhileIdle= true
spring.datasource.testOnBorrow= false
spring.datasource.testOnReturn= false
spring.datasource.poolPreparedStatements= true
spring.datasource.maxPoolPreparedStatementPerConnectionSize= 20
spring.datasource.filters= stat,wall,log4j
spring.datasource.connectionProperties= druid.stat.mergeSql= true; druid.stat.slowSqlMillis= 5000
log4j.rootCategory= INFO, stdout
log4j.rootLogger= info, stdout
log4j.appender.stdout= org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target= System.out
log4j.appender.stdout.layout= org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %d{ ABSOLUTE} %5p - %m%n
log4j.logger.org.springframework= info
log4j.logger.org.apache.catalina= info
log4j.logger.org.apache.commons.digester.Digester= info
log4j.logger.org.apache.catalina.startup.TldConfig= info
log4j.logger.chb.test= debug
spring.jpa.properties.hibernate.hbm2ddl.auto= update
spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults= false
spring.jpa.show-sql= true
log4j.properties
log4j.rootLogger= info,stdout,D,E
log4j.appender.stdout= org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target= System.out
log4j.appender.stdout.layout= org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %d{ yy-MM-dd HH:mm:ss} %p %c{ 1} : %m%n
log4j.appender.D= org.apache.log4j.RollingFileAppender
log4j.appender.D.File= /opt/lb/facelinkmac0/log/debug.log
log4j.appender.D.Append= true
log4j.appender.D.Threshold= DEBUG
log4j.appender.D.layout= org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern= %d{ yy-MM-dd HH:mm:ss} %p %c{ 1} : %m%n
log4j.appender.E= org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File= /opt/lb/facelinkmac0/log/error.log
log4j.appender.E.Append= true
log4j.appender.E.Threshold= ERROR
log4j.appender.E.layout= org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern= %d{ yy-MM-dd HH:mm:ss} %p %c{ 1} : %m%n
log4j2-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
< configuration status = " debug" >
< Properties>
< Property name = " LOG_HOME" > D:/build/house/house-service/logs</ Property>
< Property name = " LOG_PATTERN" > %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%logger{50}:%L] [%X{X-B3-TraceId},%X{X-B3-SpanId}] - %msg%n</ Property>
</ Properties>
< appenders>
< Console name = " STDOUT" >
< ThresholdFilter level = " debug" onMatch = " ACCEPT" onMismatch = " DENY" />
< PatternLayout pattern = " ${LOG_PATTERN}" charset = " utf-8" />
</ Console>
< RollingRandomAccessFile name = " FILE-INFO" fileName = " ${LOG_HOME}/house-info.log" filePattern = " ${LOG_HOME}/house-info.%d{yyyy-MM-dd-HH}.log" >
< ThresholdFilter level = " info" onMatch = " ACCEPT" onMismatch = " DENY" />
< PatternLayout pattern = " ${LOG_PATTERN}" charset = " UTF-8" />
< TimeBasedTriggeringPolicy interval = " 1" />
< DefaultRolloverStrategy max = " 1" >
< Delete basePath = " ${LOG_HOME}" maxDepth = " 2" >
< IfFileName glob = " *house-info.*.log" />
< IfLastModified age = " 1h" />
</ Delete>
</ DefaultRolloverStrategy>
</ RollingRandomAccessFile>
< RollingRandomAccessFile name = " FILE-DEBUG" fileName = " ${LOG_HOME}/house-debug.log" filePattern = " ${LOG_HOME}/house-debug.%d{yyyy-MM-dd-HH}.log" >
< ThresholdFilter level = " debug" onMatch = " ACCEPT" onMismatch = " DENY" />
< PatternLayout pattern = " ${LOG_PATTERN}" charset = " UTF-8" />
< TimeBasedTriggeringPolicy interval = " 1" />
< DefaultRolloverStrategy max = " 1" >
< Delete basePath = " ${LOG_HOME}" maxDepth = " 2" >
< IfFileName glob = " *house-debug.*.log" />
< IfLastModified age = " 1h" />
</ Delete>
</ DefaultRolloverStrategy>
</ RollingRandomAccessFile>
< RollingRandomAccessFile name = " FILE-WARN" fileName = " ${LOG_HOME}/house-warn.log" filePattern = " ${LOG_HOME}/house-warn.%d{yyyy-MM-dd-HH}.log" >
< ThresholdFilter level = " warn" onMatch = " ACCEPT" onMismatch = " DENY" />
< PatternLayout pattern = " ${LOG_PATTERN}" charset = " UTF-8" />
< TimeBasedTriggeringPolicy interval = " 1" />
< DefaultRolloverStrategy max = " 1" >
< Delete basePath = " ${LOG_HOME}" maxDepth = " 2" >
< IfFileName glob = " *house-warn.*.log" />
< IfLastModified age = " 1h" />
</ Delete>
</ DefaultRolloverStrategy>
</ RollingRandomAccessFile>
< RollingRandomAccessFile name = " FILE-ERROR" fileName = " ${LOG_HOME}/house-error.log" filePattern = " ${LOG_HOME}/house-error.%d{yyyy-MM-dd-HH}.log" >
< ThresholdFilter level = " error" onMatch = " ACCEPT" onMismatch = " DENY" />
< PatternLayout pattern = " ${LOG_PATTERN}" charset = " UTF-8" />
< TimeBasedTriggeringPolicy interval = " 1" />
< DefaultRolloverStrategy max = " 1" >
< Delete basePath = " ${LOG_HOME}" maxDepth = " 2" >
< IfFileName glob = " *house-error.*.log" />
< IfLastModified age = " 1h" />
</ Delete>
</ DefaultRolloverStrategy>
</ RollingRandomAccessFile>
</ appenders>
< loggers>
< AsyncLogger name = " springfox" level = " OFF" />
< AsyncLogger level = " DEBUG" name = " com.house.house.mapper" additivity = " false" >
< appender-ref ref = " FILE-DEBUG" />
< appender-ref ref = " STDOUT" />
</ AsyncLogger>
< AsyncRoot level = " INFO" includeLocation = " true" >
< AppenderRef ref = " FILE-INFO" />
< AppenderRef ref = " FILE-WARN" />
< AppenderRef ref = " FILE-ERROR" />
< AppenderRef ref = " STDOUT" />
</ AsyncRoot>
</ loggers>
</ configuration>
bean
package com. company. demostaff. bean;
import lombok. *;
import javax. persistence. Column;
import javax. persistence. Entity;
import javax. persistence. Id;
import javax. persistence. Table;
import java. io. Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
@ToString
@Entity
@Table ( name = "v_get_persion_info" )
public class Staff implements Serializable {
@Id
@Column ( name = "person_id" )
private String personId;
@Column ( name = "person_name" )
private String personName;
@Column ( name = "org_path" )
private String orgPath;
@Column ( name = "face_url" )
private String faceUrl;
@Column ( name = "status" )
private Integer status;
}
druid
package com. company. demostaff. config;
import com. alibaba. druid. pool. DruidDataSource;
import org. slf4j. Logger;
import org. slf4j. LoggerFactory;
import org. springframework. beans. factory. annotation. Value;
import org. springframework. context. annotation. Bean;
import org. springframework. context. annotation. Configuration;
import org. springframework. context. annotation. Primary;
import javax. sql. DataSource;
import java. sql. SQLException;
@Configuration
public class DruidDataSourceConfiguration {
private Logger logger = LoggerFactory. getLogger ( DruidDataSourceConfiguration. class ) ;
@Value ( "${spring.datasource.url}" )
private String dbUrl;
@Value ( "${spring.datasource.username}" )
private String username;
@Value ( "${spring.datasource.password}" )
private String password;
@Value ( "${spring.datasource.driver-class-name}" )
private String driverClassName;
@Value ( "${spring.datasource.initialSize}" )
private int initialSize;
@Value ( "${spring.datasource.minIdle}" )
private int minIdle;
@Value ( "${spring.datasource.maxActive}" )
private int maxActive;
@Value ( "${spring.datasource.maxWait}" )
private int maxWait;
@Value ( "${spring.datasource.timeBetweenEvictionRunsMillis}" )
private int timeBetweenEvictionRunsMillis;
@Value ( "${spring.datasource.minEvictableIdleTimeMillis}" )
private int minEvictableIdleTimeMillis;
@Value ( "${spring.datasource.validationQuery}" )
private String validationQuery;
@Value ( "${spring.datasource.testWhileIdle}" )
private boolean testWhileIdle;
@Value ( "${spring.datasource.testOnBorrow}" )
private boolean testOnBorrow;
@Value ( "${spring.datasource.testOnReturn}" )
private boolean testOnReturn;
@Value ( "${spring.datasource.poolPreparedStatements}" )
private boolean poolPreparedStatements;
@Value ( "${spring.datasource.maxPoolPreparedStatementPerConnectionSize}" )
private int maxPoolPreparedStatementPerConnectionSize;
@Value ( "${spring.datasource.filters}" )
private String filters;
@Value ( "{spring.datasource.connectionProperties}" )
private String connectionProperties;
@Bean
@Primary
public DataSource dataSource ( ) {
DruidDataSource datasource = new DruidDataSource ( ) ;
datasource. setUrl ( this . dbUrl) ;
datasource. setUsername ( username) ;
datasource. setPassword ( password) ;
datasource. setDriverClassName ( driverClassName) ;
datasource. setInitialSize ( initialSize) ;
datasource. setMinIdle ( minIdle) ;
datasource. setMaxActive ( maxActive) ;
datasource. setMaxWait ( maxWait) ;
datasource. setTimeBetweenEvictionRunsMillis ( timeBetweenEvictionRunsMillis) ;
datasource. setMinEvictableIdleTimeMillis ( minEvictableIdleTimeMillis) ;
datasource. setValidationQuery ( validationQuery) ;
datasource. setTestWhileIdle ( testWhileIdle) ;
datasource. setTestOnBorrow ( testOnBorrow) ;
datasource. setTestOnReturn ( testOnReturn) ;
datasource. setPoolPreparedStatements ( poolPreparedStatements) ;
datasource. setMaxPoolPreparedStatementPerConnectionSize ( maxPoolPreparedStatementPerConnectionSize) ;
try {
datasource. setFilters ( filters) ;
} catch ( SQLException e) {
logger. error ( "druid configuration initialization filter,[{}]" , e) ;
}
datasource. setConnectionProperties ( connectionProperties) ;
return datasource;
}
}
repository
package com. company. demostaff. repository;
import com. company. demostaff. bean. Staff;
import org. springframework. data. jpa. repository. JpaRepository;
import org. springframework. data. jpa. repository. Query;
import org. springframework. stereotype. Repository;
import java. util. List;
@Repository
public interface StaffRepository extends JpaRepository < Staff, String> {
@Query ( value = "select * from v_get_persion_info" , nativeQuery = true )
List< Staff> findStaffs ( ) ;
}
testRepository
package com. company. demostaff. service;
import com. company. demostaff. bean. Staff;
import com. company. demostaff. repository. StaffRepository;
import org. springframework. beans. factory. annotation. Autowired;
import org. springframework. boot. ApplicationArguments;
import org. springframework. boot. ApplicationRunner;
import org. springframework. stereotype. Component;
import java. util. List;
@Component
public class XXX implements ApplicationRunner {
@Autowired
private StaffRepository staffRepository;
@Override
public void run ( ApplicationArguments args) throws Exception {
List< Staff> staff = staffRepository. findStaffs ( ) ;
System. out. println ( staff. size ( ) ) ;
}
}