spring data jpa .基本使用,多条件复合查询,报表查询。

</pre></h1><div>本文较为简单的介绍在实际代码中如何编码。<a target=_blank target="_blank" href="http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/">点击进入官网</a></div><div></div><div>第一次接触 spring data jpa 就被它吸引。非常强大的数据库操作包。</div><div></div><div>使用起来也十分简单。</div><div>第一步,实体类与表结构的对应。</div><div>实体类与数据库的关系。</div><div>有两种方法,</div><div>1,配置数据库地址,自动通过配置的实体包下的类创建对应的数据库表结构和表关系。</div><div>2,在数据库中创建表结构,表关系。通过数据库生成对应的实体类。</div><div><pre code_snippet_id="1857449" snippet_file_name="blog_20160830_2_8905298" name="code" class="plain">#mssql
db.driver=net.sourceforge.jtds.jdbc.Driver

db.url=jdbc:jtds:sqlserver://localhost:1433/dbName
db.username=
db.password=

#mysql
#db.driver=com.mysql.jdbc.Driver
#hibernate.dialect=org.hibernate.dialect.MySQLDialect
#db.url=jdbc\:mysql\://locahost\:3306/dbName?useUnicode\=true&characterEncoding\=utf-8
db.username=
db.password=

#sybase
db.driver=com.sybase.jdbc3.jdbc.SybDriver
hibernate.dialect=org.hibernate.dialect.SybaseASE15Dialect

db.url=jdbc:sybase:Tds:localhost:5000/dbName?language=us_english&charset=cp936
db.username=
db.password=


#######其他配置
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create-drop
 
#Hibernate Configuration
# dialect for sybase ase

hibernate.hbm2ddl.auto=update
#hibernate.hbm2ddl.auto=create-drop
#hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
hibernate.show_sql=true
hibernate.format_sql=true
current_session_context_class=thread
entitymanager.packages.to.scan=pack.entity

读取配置文件
@Configuration
@EnableWebMvc
@EnableTransactionManagement
//@ComponentScan("com.spr")
@PropertySource("classpath:db.properties")
@EnableJpaRepositories("pack.repository")
public class JpaConfig {

    private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";
    private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";
    private static final String PROPERTY_NAME_DATABASE_URL = "db.url";
    private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";

    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan";
    private static final String PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";

    @Resource
    private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
        dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
        dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
        dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));

        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource());
        entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistence.class);
        entityManagerFactoryBean.setPackagesToScan(
                env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));

        entityManagerFactoryBean.setJpaProperties(hibProperties());

        return entityManagerFactoryBean;
    }

//    private Properties hibProperties() {
//        Properties properties = new Properties();
//        properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
//        properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
//        return properties;
//    }
    private Properties hibProperties() {
        Properties properties = new Properties();
        properties.put(PROPERTY_NAME_HIBERNATE_DIALECT,
                env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
        properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL,
                env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
        properties.put("hibernate.temp.use_jdbc_metadata_defaults", "false");
        properties.put(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO,
                env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO));
        return properties;
    }

    @Bean
    public JpaTransactionManager transactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
        return transactionManager;
    }

//    @Bean
//    public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) throws SQLException {
//
//        JpaTransactionManager txManager = new JpaTransactionManager();
//        txManager.setEntityManagerFactory(entityManagerFactory);
//        return txManager;
//    }

}

Repository 接口
public interface CreditApplyRecordRepository extends PagingAndSortingRepository<CreditApplyRecord, Integer>, JpaSpecificationExecutor<CreditApplyRecord> {

    Set<CreditApplyRecord> findByIdIn(Set<Integer> ids);

}

关于   Repository 在官网查看相关说明,在Repository中定义方法命名规则
 Supported keywords inside method names
Keyword Sample JPQL snippet

And

findByLastnameAndFirstname

… where x.lastname = ?1 and x.firstname = ?2

Or

findByLastnameOrFirstname

… where x.lastname = ?1 or x.firstname = ?2

Is,Equals

findByFirstname,findByFirstnameIs,findByFirstnameEquals

… where x.firstname = 1?

Between

findByStartDateBetween

… where x.startDate between 1? and ?2

LessThan

findByAgeLessThan

… where x.age < ?1

LessThanEqual

findByAgeLessThanEqual

… where x.age ⇐ ?1

GreaterThan

findByAgeGreaterThan

… where x.age > ?1

GreaterThanEqual

findByAgeGreaterThanEqual

… where x.age >= ?1

After

findByStartDateAfter

… where x.startDate > ?1

Before

findByStartDateBefore

… where x.startDate < ?1

IsNull

findByAgeIsNull

… where x.age is null

IsNotNull,NotNull

findByAge(Is)NotNull

… where x.age not null

Like

findByFirstnameLike

… where x.firstname like ?1

NotLike

findByFirstnameNotLike

… where x.firstname not like ?1

StartingWith

findByFirstnameStartingWith

… where x.firstname like ?1 (parameter bound with appended %)

EndingWith

findByFirstnameEndingWith

… where x.firstname like ?1 (parameter bound with prepended %)

Containing

findByFirstnameContaining

… where x.firstname like ?1 (parameter bound wrapped in %)

OrderBy

findByAgeOrderByLastnameDesc

… where x.age = ?1 order by x.lastname desc

Not

findByLastnameNot

… where x.lastname <> ?1

In

findByAgeIn(Collection<Age> ages)

… where x.age in ?1

NotIn

findByAgeNotIn(Collection<Age> age)

… where x.age not in ?1

True

findByActiveTrue()

… where x.active = true

False

findByActiveFalse()

… where x.active = false

IgnoreCase

findByFirstnameIgnoreCase

… where UPPER(x.firstame) = UPPER(?1)


完成以上步骤就可以在业务中使用 数据库的增删改查。

下面来说如果完成 不定条件符合查询。
上面示例中 CreditApplyRecordRepository 继承  JpaSpecificationExecutor。改接口

关于  JpaSpecificationExecutor 的使用
想初始化一个  predicate 。类似1==1的。没有找到就在下面

Page<CreditCard> creditCard = creditCardRepo.findAll(new Specification<CreditCard>() {
            @Override
            public Predicate toPredicate(Root<CreditCard> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
                Predicate predicate = null;
//                if (null != appDateStart && null != appDateEnd) {
//                    predicate = cb.between(root.<Date>get("appdate"), appDateStart, appDateEnd);
//                }
                Set<String> orgNums = new HashSet<String>();
                orgNums.add(orgNum);
                if (null != orgNum) {
                    if (null != predicate) {
                        Expression<String> exOrgNum = root.<String>get("organNum");
                        predicate = cb.and(predicate, exOrgNum.in(orgNums));
                    } else {
                        Path<String> exOrgNum = root.<String>get("organNum");
                        predicate = exOrgNum.in(orgNums);
                    }
                }
                if (null != brand&&!("".equals(brand))) {
                    if (null != predicate) {
                        predicate = cb.and(predicate, cb.equal(root.<String>get("brand"), brand));
                    } else {
                        predicate = cb.equal(root.<String>get("brand"), brand);
                    }
                }
                if (null != currency&&!("".equals(currency))) {
                    if (null != predicate) {
                        predicate = cb.and(predicate, cb.equal(root.<String>get("currency"), currency));
                    } else {
                        predicate = cb.equal(root.<String>get("currency"), currency);
                    }
                }
                if (null != grade&&!("".equals(grade))) {
                    if (null != predicate) {
                        predicate = cb.and(predicate, cb.equal(root.<String>get("grade"), grade));
                    } else {
                        predicate = cb.equal(root.<String>get("grade"), grade);
                    }
                }
                if (null != media&&!("".equals(media))) {
                    if (null != predicate) {
                        predicate = cb.and(predicate, cb.equal(root.<String>get("media"), media));
                    } else {
                        predicate = cb.equal(root.<String>get("media"), media);
                    }
                }
                if (null != cardType&&!("".equals(cardType))) {
                    if (null != predicate) {
                        predicate = cb.and(predicate, cb.equal(root.<String>get("cardType"), cardType));
                    } else {
                        predicate = cb.equal(root.<String>get("cardType"), cardType);
                    }
                }
                if (null != predicate) {
                    cq.where(predicate);
                }
                return null;
            }
        },
                new PageRequest(pageIndex, pageSize)
        );

关于统计报表类的

 
@PersistenceContext
    EntityManager entityManager;  

String sql = String.format("sql_");

        Query query = entityManager.createNativeQuery(sql);
        List objecArraytList = query.getResultList();




 
 



  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spring Data JPA 支持多条件查询,可以使用 @Query 注解或者方法名规则来实现。 1. 使用 @Query 注解 可以在 Repository 接口中使用 @Query 注解来定义查询语句,例如: ```java @Repository public interface UserRepository extends JpaRepository<User, Long> { @Query("select u from User u where u.name = ?1 and u.age > ?2") List<User> findByNameAndAgeGreaterThan(String name, int age); } ``` 这个例子中,我们定义了一个方法 findByNameAndAgeGreaterThan,它接受两个参数 name 和 age,使用 @Query 注解来定义查询语句,查询条件为 name 和 age。这个方法会返回一个 List<User> 对象,包含满足条件的所有用户。 2. 使用方法名规则 Spring Data JPA 还支持使用方法名规则来定义查询方法,例如: ```java @Repository public interface UserRepository extends JpaRepository<User, Long> { List<User> findByNameAndAgeGreaterThan(String name, int age); } ``` 这个例子中,我们定义了一个方法 findByNameAndAgeGreaterThan,它接受两个参数 name 和 age,方法名符合方法名规则,Spring Data JPA 会自动解析方法名,生成查询语句,查询条件为 name 和 age。这个方法会返回一个 List<User> 对象,包含满足条件的所有用户。 总结 Spring Data JPA 支持多条件查询,可以使用 @Query 注解或者方法名规则来实现。使用 @Query 注解可以自定义查询语句,使用方法名规则可以简化代码,提高开发效率。 ### 回答2: Spring Data JPASpring Framework 的子项目之一,可简化与数据库的 CRUD 操作。在 JPA 规范的基础上,Spring Data JPA 进一步简化了 CRUD 操作的过程,特别是在使用条件查询时具有较大的便利性。Spring Data JPA 中的多条件查询主要可以使用以下两种方式: 一、通过命名查询实现多条件查询Spring Data JPA 提供了基于命名查询的方式来查询数据,方便快捷,使得查询和业务代码分离,具有很好地维护性和灵活性。我们只需要定义一个符合语法规范的 JQL 语句,然后通过 @Query 注解将其绑定到自定义的查询方法上。参数列表中可以配置多个条件Spring Data JPA 会自动将这些条件组装成一个完整的 SQL 查询语句,然后执行查询操作。 举例来说,如果我们要查询年龄在 20 到 30 岁之间,并且居住城市为北京的用户信息,可以通过如下的方式定义一个命名查询: @Query("select u from User u where u.age >= ?1 and u.age <= ?2 and u.city = ?3") List<User> findByAgeAndCityBetween(int minAge, int maxAge, String city); 在这个例子中,我们定义了一个名为“findByAgeAndCityBetween”的查询方法,使用JPA 的命名查询语法,从 User 实体中查询符合条件的记录,并返回查询结果的列表。 二、通过 Specification 来实现多条件查询Spring Data JPA 还提供了通过 Specification 来实现多条件查询的方式。Specification 是 Spring Data JPA 中的一个接口,我们可以通过实现 Specification 接口的方式来构造查询条件。它提供了一个 where 子句,包含了查询条件,是一个单独的类。我们只需要实现 Specification 接口中的 toPredicate 方法,将查询条件组装成一个 Predicate 对象,然后传递给 JPA 的 CriteriaQuery 对象,就可以实现多条件查询的效果。 例如,我们要查询所有年龄在 20 到 30 岁之间,并且居住城市为北京的用户信息,可以通过如下的方式来实现: public static Specification<User> searchUsers(int minAge, int maxAge, String city) { return new Specification<User>() { @Override public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder builder) { List<Predicate> predicates = new ArrayList<>(); predicates.add(builder.between(root.get("age"), minAge, maxAge)); predicates.add(builder.equal(root.get("city"), city)); return builder.and(predicates.toArray(new Predicate[predicates.size()])); } }; } 在这个例子中,我们定义了一个名为“searchUsers”的 Specification 接口实现类,使用JPA 的 CriteriaBuilder 和 CriteriaQuery API 实现了多条件查询。我们通过 root.get("") 方法来获取查询的属性,builder.between() 方法来获取查询区间,builder.equal() 方法来获取等值查询。最后将多个查询条件封装成了一个 Predicate 对象,通过 builder.and() 方法进行逻辑与操作。我们可以将这个 Specification 对象传递给 JpaRepository 的 findAll() 方法,Spring Data JPA 会根据 Specification 来动态生成 SQL 查询语句,然后执行查询操作。 综上所述,Spring Data JPA 中的多条件查询可以通过以上两种方式来实现,不论是基于命名查询还是 Specification,都具有较高的实用性和便利性。在实际开发中,可以根据具体情况来选择不同的查询方式,提高代码的可读性和可维护性。 ### 回答3: Spring Data JPASpring对于JPA的实现方式,它可以简化复杂的JPA操作,并提供了很多便捷的查询方法。在开发过程中,我们经常需要使用多个条件进行查询,在Spring Data JPA中也提供了多种实现方式。 1.使用@Query注解 在实体类对应的Repository中,我们可以使用@Query注解来自定义查询语句。 比如我们需要查询age大于20,name为xiao的User,则可以定义如下方法: @Query("select u from User u where u.age > 20 and u.name = 'xiao'") List<User> findByAgeAndName(); 2.使用Specification接口 另一种实现方式是使用Specification接口。它可以动态的构造查询条件,设计精细,可扩展性强。 首先定义一个Specification接口,比如我们需要查询age大于20,name为xiao的User: public static Specification<User> findByAgeAndName() { return (root, query, cb) -> { List<Predicate> predicates = new ArrayList<>(); predicates.add(cb.gt(root.get("age"), 20)); predicates.add(cb.equal(root.get("name"), "xiao")); query.where(predicates.toArray(new Predicate[predicates.size()])); return query.getRestriction(); }; } 然后在Repository中使用这个Specification: List<User> userList = userRepository.findAll(findByAgeAndName()); 这样就能够查询到age大于20,name为xiao的User。 3.使用QueryDSL QueryDSL可以提供类型安全和可读性较高的查询语法。它可以通过代码生成器自动生成查询类,可以减少手写SQL的时间和错误。 首先按照官方文档进行依赖配置和代码生成器的使用,生成查询类后进行查询操作: QUser user = QUser.user; List<User> userList = userRepository.findAll(user.age.gt(20).and(user.name.eq("xiao"))); 以上便是Spring Data JPA的多条件查询方法,可以根据具体情况选择最适合自己的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值