添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

使用过spring data jpa的同学,都很清楚,对于复杂的sql查询,处理起来还是比较复杂的,而本文中的QueryDSL就是用来简化JPA操作的。

Querydsl定义了一种常用的静态类型语法,用于在持久域模型数据之上进行查询。JDO和JPA是Querydsl的主要集成技术。本文旨在介绍如何使用Querydsl与JPA组合使用。 JPA的Querydsl是JPQL和Criteria查询的替代方法。QueryDSL仅仅是一个通用的查询框架,专注于通过Java API构建类型安全的SQL查询。

要想使用QueryDSL,需要做两个前提操作:

1、pom文件中,加入依赖

  1. <!--query dsl -->
  2. < dependency >
  3. < groupId > com.querydsl </ groupId >
  4. < artifactId > querydsl-jpa </ artifactId >
  5. </ dependency >
  6. < dependency >
  7. < groupId > com.querydsl </ groupId >
  8. < artifactId > querydsl-apt </ artifactId >
  9. < scope > provided </ scope >
  10. </ dependency >
2、pom文件中,加入编译插件
  1. < plugin >
  2. < groupId > com.mysema.maven </ groupId >
  3. < artifactId > apt-maven-plugin </ artifactId >
  4. < version > 1.1.3 </ version >
  5. < executions >
  6. < execution >
  7. < goals >
  8. < goal > process </ goal >
  9. </ goals >
  10. < configuration >
  11. < outputDirectory > target/generated-sources/java </ outputDirectory >
  12. < processor > com.querydsl.apt.jpa.JPAAnnotationProcessor </ processor >
  13. </ configuration >
  14. </ execution >
  15. </ executions >
  16. </ plugin >
查找使用javax.persistence.Entity注解的域类型,并为它们生成对应的查询类型。下面以User实体类来说明,生成的查询类型如下:
  1. package com.chhliu.springboot.jpa.entity;
  2. import static com.querydsl.core.types.PathMetadataFactory.*;
  3. import com.querydsl.core.types.dsl.*;
  4. import com.querydsl.core.types.PathMetadata;
  5. import javax.annotation.Generated;
  6. import com.querydsl.core.types.Path;
  7. /**
  8. * QUser is a Querydsl query type for User
  9. */
  10. @Generated ( "com.querydsl.codegen.EntitySerializer" )
  11. public class QUser extends EntityPathBase<User> {
  12. private static final long serialVersionUID = 1153899872L;
  13. public static final QUser user = new QUser( "user" );
  14. public final StringPath address = createString( "address" );
  15. public final NumberPath<Integer> age = createNumber( "age" , Integer. class );
  16. public final NumberPath<Integer> id = createNumber( "id" , Integer. class );
  17. public final StringPath name = createString( "name" );
  18. public QUser(String variable) {
  19. super (User. class , forVariable(variable));
  20. }
  21. public QUser(Path<? extends User> path) {
  22. super (path.getType(), path.getMetadata());
  23. }
  24. public QUser(PathMetadata metadata) {
  25. super (User. class , metadata);
  26. }
  27. }
我们建立好实体类之后,然后运行mvn clean complie命令,就会在 [html] view plain
  1. < outputDirectory > target/generated-sources/java </ outputDirectory >
目录下生成对应的查询类型。然后将生成的类都拷贝到项目中,即可。

本文涉及到的Entity如下:

  1. package com.chhliu.springboot.jpa.entity;
  2. import java.io.Serializable;
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.GenerationType;
  6. import javax.persistence.Id;
  7. import javax.persistence.Table;
  8. @Entity
  9. @Table (name= "t_user" )
  10. public class User implements Serializable{
  11. /**
  12. *
  13. */
  14. private static final long serialVersionUID = 1L;
  15. @Id ()
  16. @GeneratedValue (strategy = GenerationType.AUTO)
  17. private int id;
  18. private String name;
  19. private String address;
  20. private int age;
  21. …………省略getter,setter方法…………
  22. /**
  23. * attention:
  24. * Details:方便查看测试结果
  25. * @author chhliu
  26. */
  27. @Override
  28. public String toString() {
  29. return "User [id=" + id + ", name=" + name + ", address=" + address + ", age=" + age + "]" ;
  30. }
  31. }
上面的这个实体类,主要用于单表操作。
  1. package com.chhliu.springboot.jpa.entity;
  2. import javax.persistence.CascadeType;
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.Id;
  6. import javax.persistence.OneToOne;
  7. import javax.persistence.Table;
  8. /**
  9. * 描述:TODO
  10. * @author chhliu
  11. */
  12. @Entity
  13. @Table (name= "PERSON" )
  14. public class Person {
  15. @Id
  16. @GeneratedValue
  17. private Integer id;
  18. private String name;
  19. private String address;
  20. @OneToOne (mappedBy= "person" , cascade={CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE})
  21. private IDCard idCard;
  22. …………省略getter,setter方法…………
  23. @Override
  24. public String toString() {
  25. return "Person [id=" + id + ", name=" + name + ", address=" + address + ", idCard=" + idCard + "]" ;
  26. }
  27. }
  1. package com.chhliu.springboot.jpa.entity;
  2. import javax.persistence.CascadeType;
  3. import javax.persistence.Entity;
  4. import javax.persistence.FetchType;
  5. import javax.persistence.GeneratedValue;
  6. import javax.persistence.Id;
  7. import javax.persistence.OneToOne;
  8. import javax.persistence.Table;
  9. /**
  10. * 描述:
  11. * @author chhliu
  12. */
  13. @Entity
  14. @Table (name= "IDCARD" )
  15. public class IDCard {
  16. @Id
  17. @GeneratedValue
  18. private Integer id;
  19. private String idNo;
  20. @OneToOne (cascade={CascadeType.MERGE, CascadeType.REMOVE, CascadeType.PERSIST}, fetch=FetchType.EAGER)
  21. private Person person;
  22. …………省略getter,setter方法…………
  23. @Override
  24. public String toString() {
  25. return "IDCard [id=" + id + ", idNo=" + idNo + ", person=" + person + "]" ;
  26. }
  27. }
上面两个Entity主要用于一对一关系的示例操作
  1. package com.chhliu.springboot.jpa.entity;
  2. import java.util.List;
  3. import javax.persistence.CascadeType;
  4. import javax.persistence.Column;
  5. import javax.persistence.Entity;
  6. import javax.persistence.FetchType;
  7. import javax.persistence.GeneratedValue;
  8. import javax.persistence.Id;
  9. import javax.persistence.OneToMany;
  10. import javax.persistence.Table;
  11. /**
  12. * 描述:Order实体类
  13. * @author chhliu
  14. */
  15. @Entity
  16. @Table (name= "ORDER_C" )
  17. public class Order {
  18. @Id
  19. @GeneratedValue
  20. @Column (name= "ID" )
  21. private Integer id;
  22. @Column (length= 20 , name= "ORDER_NAME" )
  23. private String orderName;
  24. @Column (name= "COUNT" )
  25. private Integer count;
  26. @OneToMany (mappedBy = "order" ,cascade={CascadeType.PERSIST,CascadeType.REMOVE},fetch = FetchType.EAGER)
  27. private List<OrderItem> orderItems;
  28. …………省略getter,setter方法…………
  29. }
  1. package com.chhliu.springboot.jpa.entity;
  2. import javax.persistence.CascadeType;
  3. import javax.persistence.Column;
  4. import javax.persistence.Entity;
  5. import javax.persistence.FetchType;
  6. import javax.persistence.GeneratedValue;
  7. import javax.persistence.Id;
  8. import javax.persistence.JoinColumn;
  9. import javax.persistence.ManyToOne;
  10. import javax.persistence.Table;
  11. /**
  12. * 描述:OrderItem实体类
  13. * @author chhliu
  14. */
  15. @Entity
  16. @Table (name= "ORDER_ITEM" )
  17. public class OrderItem {
  18. @Id
  19. @GeneratedValue
  20. @Column (name= "ID" , nullable= false )
  21. private Integer id;
  22. @Column (name= "ITEM_NAME" , length= 20 )
  23. private String itemName;
  24. @Column (name= "PRICE" )
  25. private Integer price;
  26. @ManyToOne (cascade={CascadeType.PERSIST,CascadeType.REMOVE, CascadeType.MERGE}, fetch=FetchType.EAGER)
  27. @JoinColumn (name = "ORDER_ID" )
  28. private Order order;
  29. …………省略getter,setter方法…………
  30. }
上面两个Entity用于展示一对多关系的示例操作。

首先,我们来看单表操作

1、使用spring data jpa

要想使用spring data jpa提供的QueryDSL功能,很简单,直接继承接口即可。Spring Data JPA中提供了QueryDslPredicateExecutor接口,用于支持QueryDSL的查询操作接口,如下:

  1. package com.chhliu.springboot.jpa.repository;
  2. import org.springframework.data.jpa.repository.JpaRepository;
  3. import org.springframework.data.querydsl.QueryDslPredicateExecutor;
  4. import com.chhliu.springboot.jpa.entity.User;
  5. public interface UserRepositoryDls extends JpaRepository<User, Integer>, QueryDslPredicateExecutor<User>{ // 继承<span id="result_box" lang="zh-CN"><span><span id="result_box" lang="zh-CN"><span></span></span></span></span>QueryDslPredicateExecutor<span id="result_box" lang="zh-CN"><span><span id="result_box" lang="zh-CN"></span></span></span>接口
  6. }
QueryDslPredicateExecutor接口提供了如下方法:
  1. public interface QueryDslPredicateExecutor<T> {
  2. T findOne(Predicate predicate);
  3. Iterable<T> findAll(Predicate predicate);
  4. Iterable<T> findAll(Predicate predicate, Sort sort);
  5. Iterable<T> findAll(Predicate predicate, OrderSpecifier<?>... orders);
  6. Iterable<T> findAll(OrderSpecifier<?>... orders);
  7. Page<T> findAll(Predicate predicate, Pageable pageable);
  8. long count(Predicate predicate);
  9. boolean exists(Predicate predicate);
  10. }
以上方法的使用和spring data jpa中的其他接口使用方法类似,详情请参考:

http://blog.csdn.net/liuchuanhong1/article/details/52042477

测试如下:

  1. public User findUserByUserName( final String userName){
  2. /**
  3. * 该例是使用spring data QueryDSL实现
  4. */
  5. QUser quser = QUser.user;
  6. Predicate predicate = quser.name.eq(userName); // 根据用户名,查询user表
  7. return repository.findOne(predicate);
  8. }
对应的sql如下:
  1. select user0_.id as id1_5_, user0_.address as address2_5_, user0_.age as age3_5_, user0_.name as name4_5_ from t_user user0_ where  user0_.name=?
单表操作示例代码如下:
  1. package com.chhliu.springboot.jpa.repository;
  2. import java.util.List;
  3. import javax.persistence.EntityManager;
  4. import javax.persistence.PersistenceContext;
  5. import javax.persistence.Query;
  6. import javax.transaction.Transactional;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.data.domain.Page;
  9. import org.springframework.data.domain.PageRequest;
  10. import org.springframework.data.domain.Sort;
  11. import org.springframework.stereotype.Component;
  12. import com.chhliu.springboot.jpa.entity.QUser;
  13. import com.chhliu.springboot.jpa.entity.User;
  14. import com.querydsl.core.types.Predicate;
  15. import com.querydsl.jpa.impl.JPAQueryFactory;
  16. /**
  17. * 描述:QueryDSL JPA
  18. * @author chhliu
  19. */
  20. @Component
  21. @Transactional
  22. public class UserRepositoryManagerDsl {
  23. @Autowired
  24. private UserRepositoryDls repository;
  25. @Autowired
  26. @PersistenceContext
  27. private EntityManager entityManager;
  28. private JPAQueryFactory queryFactory;
  29. @PostConstruct
  30. public void init() {
  31. queryFactory = new JPAQueryFactory(entityManager);
  32. }
  33. public User findUserByUserName( final String userName){
  34. /**
  35. * 该例是使用spring data QueryDSL实现
  36. */
  37. QUser quser = QUser.user;
  38. Predicate predicate = quser.name.eq(userName);
  39. return repository.findOne(predicate);
  40. }
  41. /**
  42. * attention:
  43. * Details:查询user表中的所有记录
  44. */
  45. public List<User> findAll(){
  46. QUser quser = QUser.user;
  47. return queryFactory.selectFrom(quser)
  48. .fetch();
  49. }
  50. /**
  51. * Details:单条件查询
  52. */
  53. public User findOneByUserName( final String userName){
  54. QUser quser = QUser.user;
  55. return queryFactory.selectFrom(quser)
  56. .where(quser.name.eq(userName))
  57. .fetchOne();
  58. }
  59. /**
  60. * Details:单表多条件查询
  61. */
  62. public User findOneByUserNameAndAddress( final String userName, final String address){
  63. QUser quser = QUser.user;
  64. return queryFactory.select(quser)
  65. .from(quser) // 上面两句代码等价与selectFrom
  66. .where(quser.name.eq(userName).and(quser.address.eq(address))) // 这句代码等同于where(quser.name.eq(userName), quser.address.eq(address))
  67. .fetchOne();
  68. }
  69. /**
  70. * Details:使用join查询
  71. */
  72. public List<User> findUsersByJoin(){
  73. QUser quser = QUser.user;
  74. QUser userName = new QUser( "name" );
  75. return queryFactory.selectFrom(quser)
  76. .innerJoin(quser)
  77. .on(quser.id.intValue().eq(userName.id.intValue()))
  78. .fetch();
  79. }
  80. /**
  81. * Details:将查询结果排序
  82. */
  83. public List<User> findUserAndOrder(){
  84. QUser quser = QUser.user;
  85. return queryFactory.selectFrom(quser)
  86. .orderBy(quser.id.desc())
  87. .fetch();
  88. }
  89. /**
  90. * Details:Group By使用
  91. */
  92. public List<String> findUserByGroup(){
  93. QUser quser = QUser.user;
  94. return queryFactory.select(quser.name)
  95. .from(quser)
  96. .groupBy(quser.name)
  97. .fetch();
  98. }
  99. /**
  100. * Details:删除用户
  101. */
  102. public long deleteUser(String userName){
  103. QUser quser = QUser.user;
  104. return queryFactory.delete(quser).where(quser.name.eq(userName)).execute();
  105. }
  106. /**
  107. * Details:更新记录
  108. */
  109. public long updateUser( final User u, final String userName){
  110. QUser quser = QUser.user;
  111. return queryFactory.update(quser).where(quser.name.eq(userName))
  112. .set(quser.name, u.getName())
  113. .set(quser.age, u.getAge())
  114. .set(quser.address, u.getAddress())
  115. .execute();
  116. }
  117. /**
  118. * Details:使用原生Query
  119. */
  120. public User findOneUserByOriginalSql( final String userName){
  121. QUser quser = QUser.user;
  122. Query query = queryFactory.selectFrom(quser)
  123. .where(quser.name.eq(userName)).createQuery();
  124. return (User) query.getSingleResult();
  125. }
  126. /**
  127. * Details:分页查询单表
  128. */
  129. public Page<User> findAllAndPager( final int offset, final int pageSize){
  130. Predicate predicate = QUser.user.id.lt( 10 );
  131. Sort sort = new Sort( new Sort.Order(Sort.Direction.DESC, "id" ));
  132. PageRequest pr = new PageRequest(offset, pageSize, sort);
  133. return repository.findAll(predicate, pr);
  134. }
  135. }
多表操作示例(一对一)如下:
  1. package com.chhliu.springboot.jpa.repository;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import javax.annotation.PostConstruct;
  5. import javax.persistence.EntityManager;
  6. import javax.persistence.PersistenceContext;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Component;
  9. import com.chhliu.springboot.jpa.dto.PersonIDCardDto;
  10. import com.chhliu.springboot.jpa.entity.QIDCard;
  11. import com.chhliu.springboot.jpa.entity.QPerson;
  12. import com.querydsl.core.QueryResults;
  13. import com.querydsl.core.Tuple;
  14. import com.querydsl.core.types.Predicate;
  15. import com.querydsl.jpa.impl.JPAQuery;
  16. import com.querydsl.jpa.impl.JPAQueryFactory;
  17. @Component
  18. public class PersonAndIDCardManager {
  19. @Autowired
  20. @PersistenceContext
  21. private EntityManager entityManager;
  22. private JPAQueryFactory queryFactory;
  23. @PostConstruct
  24. public void init() {
  25. queryFactory = new JPAQueryFactory(entityManager);
  26. }
  27. /**
  28. * Details:多表动态查询
  29. */
  30. public List<Tuple> findAllPersonAndIdCard(){
  31. Predicate predicate = (QPerson.person.id.intValue()).eq(QIDCard.iDCard.person.id.intValue());
  32. JPAQuery<Tuple> jpaQuery = queryFactory.select(QIDCard.iDCard.idNo, QPerson.person.address, QPerson.person.name)
  33. .from(QIDCard.iDCard, QPerson.person)
  34. .where(predicate);
  35. return jpaQuery.fetch();
  36. }
  37. /**
  38. * Details:将查询结果以DTO的方式输出
  39. */
  40. public List<PersonIDCardDto> findByDTO(){
  41. Predicate predicate = (QPerson.person.id.intValue()).eq(QIDCard.iDCard.person.id.intValue());
  42. JPAQuery<Tuple> jpaQuery = queryFactory.select(QIDCard.iDCard.idNo, QPerson.person.address, QPerson.person.name)
  43. .from(QIDCard.iDCard, QPerson.person)
  44. .where(predicate);
  45. List<Tuple> tuples = jpaQuery.fetch();
  46. List<PersonIDCardDto> dtos = new ArrayList<PersonIDCardDto>();
  47. if ( null != tuples && !tuples.isEmpty()){
  48. for (Tuple tuple:tuples){
  49. String address = tuple.get(QPerson.person.address);
  50. String name = tuple.get(QPerson.person.name);
  51. String idCard = tuple.get(QIDCard.iDCard.idNo);
  52. PersonIDCardDto dto = new PersonIDCardDto();
  53. dto.setAddress(address);
  54. dto.setIdNo(idCard);
  55. dto.setName(name);
  56. dtos.add(dto);
  57. }
  58. }
  59. return dtos;
  60. }
  61. /**
  62. * Details:多表动态查询,并分页
  63. */
  64. public QueryResults<Tuple> findByDtoAndPager( int offset, int pageSize){
  65. Predicate predicate = (QPerson.person.id.intValue()).eq(QIDCard.iDCard.person.id.intValue());
  66. return queryFactory.select(QIDCard.iDCard.idNo, QPerson.person.address, QPerson.person.name)
  67. .from(QIDCard.iDCard, QPerson.person)
  68. .where(predicate)
  69. .offset(offset)
  70. .limit(pageSize)
  71. .fetchResults();
  72. }
  73. }

上面将查询结果以DTO的方式输出的示例中,在查询结束后,将查询结果手动的转换成了DTO对象,这种方式其实不太优雅,QueryDSL给我们提供了更好的方式,见下面的示例:

  1. /**
  2. * Details:方式一:使用Bean投影
  3. */
  4. public List<PersonIDCardDto> findByDTOUseBean(){
  5. Predicate predicate = (QPerson.person.id.intValue()).eq(QIDCard.iDCard.person.id.intValue());
  6. return queryFactory.select(
  7. Projections.bean(PersonIDCardDto. class , QIDCard.iDCard.idNo, QPerson.person.address, QPerson.person.name))
  8. .from(QIDCard.iDCard, QPerson.person)
  9. .where(predicate)
  10. .fetch();
  11. }
  12. /**
  13. * Details:方式二:使用fields来代替setter
  14. */
  15. public List<PersonIDCardDto> findByDTOUseFields(){
  16. Predicate predicate = (QPerson.person.id.intValue()).eq(QIDCard.iDCard.person.id.intValue());
  17. return queryFactory.select(
  18. Projections.fields(PersonIDCardDto. class , QIDCard.iDCard.idNo, QPerson.person.address, QPerson.person.name))
  19. .from(QIDCard.iDCard, QPerson.person)
  20. .where(predicate)
  21. .fetch();
  22. }
  23. /**
  24. * Details:方式三:使用构造方法,注意构造方法中属性的顺序必须和构造器中的顺序一致
  25. */
  26. public List<PersonIDCardDto> findByDTOUseConstructor(){
  27. Predicate predicate = (QPerson.person.id.intValue()).eq(QIDCard.iDCard.person.id.intValue());
  28. return queryFactory.select(
  29. Projections.constructor(PersonIDCardDto. class , QPerson.person.name, QPerson.person.address, QIDCard.iDCard.idNo))
  30. .from(QIDCard.iDCard, QPerson.person)
  31. .where(predicate)
  32. .fetch();
  33. }
上面只是提供了几种思路,当然,还可以使用@QueryProjection来实现,非常灵活。 一对多示例:
  1. package com.chhliu.springboot.jpa.repository;
  2. import java.util.List;
  3. import javax.annotation.PostConstruct;
  4. import javax.persistence.EntityManager;
  5. import javax.persistence.PersistenceContext;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Component;
  8. import com.chhliu.springboot.jpa.entity.QOrder;
  9. import com.chhliu.springboot.jpa.entity.QOrderItem;
  10. import com.querydsl.core.Tuple;
  11. import com.querydsl.core.types.Predicate;
  12. import com.querydsl.jpa.impl.JPAQuery;
  13. import com.querydsl.jpa.impl.JPAQueryFactory;
  14. @Component
  15. public class OrderAndOrderItemManager {
  16. @Autowired
  17. @PersistenceContext
  18. private EntityManager entityManager;
  19. private JPAQueryFactory queryFactory;
  20. @PostConstruct
  21. public void init() {
  22. queryFactory = new JPAQueryFactory(entityManager);
  23. }
  24. /**
  25. * Details:一对多,条件查询
  26. */
  27. public List<Tuple> findOrderAndOrderItemByOrderName(String orderName){
  28. //添加查询条件
  29. Predicate predicate = QOrder.order.orderName.eq(orderName);
  30. JPAQuery<Tuple> jpaQuery = queryFactory.select(QOrder.order, QOrderItem.orderItem)
  31. .from(QOrder.order, QOrderItem.orderItem)
  32. .where(QOrderItem.orderItem.order.id.intValue().eq(QOrder.order.id.intValue()), predicate);
  33. //拿到结果
  34. return jpaQuery.fetch();
  35. }
  36. /**
  37. * Details:多表连接查询
  38. */
  39. public List<Tuple> findAllByOrderName(String orderName){
  40. //添加查询条件
  41. Predicate predicate = QOrder.order.orderName.eq(orderName);
  42. JPAQuery<Tuple> jpaQuery = queryFactory.select(QOrder.order, QOrderItem.orderItem)
  43. .from(QOrder.order, QOrderItem.orderItem)
  44. .rightJoin(QOrder.order)
  45. .on(QOrderItem.orderItem.order.id.intValue().eq(QOrder.order.id.intValue()));
  46. jpaQuery.where(predicate);
  47. //拿到结果
  48. return jpaQuery.fetch();
  49. }
  50. }

从上面的示例中,我们可以看出,QueryDSL大大的简化了我们的操作

原文链接:http://www.jianshu.com/p/2b68af9aa0f5 (支持原创) 1.问题的提出 最近再看公司项目中有如下代码,看了后简直不能忍.缺点列出来的话,如下: 返回类型Object[]数组,至于每一个下标对应哪个字段,没法直观的看到,例如object[11]是什么类型?字段名是什么?这个就无法直观得知.sql中 复杂 的关系导致不可维护,每一个接手的人都要研究sq
private final BaseDao dao; private final JPA Query Factory factory ; private final QUser qUser; private final QFile qFile; @Autowired public UserServiceImpl(BaseDao dao) { this...
SpirngData- JPA QueryDSL 快速入门 不可否认的是 JPA 使用是非常方便的,极 简化 的配置,只需要使用注解,无需任何 xml 的配置文件,语义简单易懂,但是,以上的一切都建立在单表查询的前提下的,我们可以使用 JPA 默认提供的方法,简单加轻松的完成 CRUD 操作 。 但是如果涉及到多表动态查询, JPA 的功能就显得有些捉襟见肘了,虽然我们可以使用注解 @Query ,在这个注解中写 SQL 或者 HQL 都是在拼接字符串,并且拼接后的字符串可读性非常的差,当然 JPA 还为我们提供了
QueryDSL 仅仅是一个通用的查询框架,专注于通过Java API构建类型安全的SQL查询。 Querydsl 可以通过一组通用的查询API为用户构建出适合不同类型ORM框架或者是SQL的查询语句,也就是说 QueryDSL 是基于各种ORM框架以及SQL之上的一个通用的查询框架。 借助 QueryDSL 可以在任何支持的ORM框架或者SQL平台上以一种通用的API方式来构建查询。目前 QueryDSL 支持的平台包括 JPA ,JDO,SQL,Java Collections,Mongodb,L
querydsl 是个不错sql动态生成拼装工具,网上很多方法都是类似hibernate或mybatis类的orm 操作 ,这里直接用它的动态生成方式,直接引入core包就行 Map<String,SQLTemplates> sqlTemplatesMap = new LinkedHashMap<>(); sqlTemplatesMap.put("mysql", ...
scoratesc: 讲的有点乱哦 刚开始讲,修改配置文件 /etc/default/docker 或者 /etc/sysconfig/docker 新增DOCKER_OPTS="-H 0.0.0.0:5555" 下面具体讲例子时,又说修改 -H fd://,可修改为:-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H fd:// --label name=server_1 但是怎么修改却没讲 8 Docker Remote API 吃蘑菇的小龙虾: 图片都没啦 网络学习 tcpdump 抓包工具 CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)增加条理清晰的目录;(2)使用标准目录。