Spring Data JPA 查询数据库时,若是两个表有关联,那么就设个外键,在查询的时候用Specification建立Join 查询即可。可是只支持左链接,不支持右链接,虽然说左右链接反过来就能实现同样的效果,可是这就关系到谁是谁的外键的问题。外键搞起来有时候确实麻烦。因此为了查询个视图,没有找到更好的办法,只好在service层查两次合并起来了。数据库
@Entity @Table(name="tb_user") public class UserInfo implements Serializable{ @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long userId; private String userName; private String password; private String name; private int age; private String sex; private String email; private Date dateOfBirth; private String telNumber; private String education; private String school; // @ManyToOne // @JoinColumn(name="addressId") // private Address address; private Long addressId; // getter and setter }
@Entity @Table(name="tb_address") public class Address implements Serializable{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long addressId; private Long userId private String areaCode; private String country; private String province; private String city; private String area; private String detailAddress; // getter and setter }
建立一个类包含UserInfo和Address中的全部属性:this
public class ViewInfo implements Serializable{ private UserInfo userInfo; private Address address; public ViewInfo(){ } public ViewInfo(UserInfo userInfo){ Address address = new Address(); this.userInfo = userInfo; this.address = address; } public ViewInfo(Address address){ UserInfo userInfo = new UserInfo(); this.userInfo = userInfo; this.address = address; } public ViewInfo(UserInfo userInfo,Address address){ this.userInfo = userInfo; this.address = address; } // getter and setter }
接下来就是在DAO层中写自定义查询语句了:spa
public interface UserInfoRepository extends CrudRepository<UserInfo, Long>{ @Query(value="SELECT new com.demo.test.Entity.ViewInfo(u,a)FROM " + " UserInfo u, com.demo.test.Entity.Address a WHERE u.addressId = a.id) ") List<ViewInfo> findViewInfo(); @Query("SELECT new com.demo.test.Entity.ViewInfo" + "(u) FROM UserInfo u WHERE u.addressId IS NULL OR u.addressId NOT IN (SELECT a.id FROM Address a)") List<ViewInfo> findViewInfoLeft(); @Query("SELECT new com.demo.test.Entity.ViewInfo" + "(a) FROM Address a WHERE a.id NOT IN (SELECT u.addressId FROM UserInfo u WHERE u.addressId IS NOT NULL)") List<ViewInfo> findViewInfoRight(); }
而后在service层中查询各个部分:code
public void summary(){ System.out.println("=======middle part======="); List<ViewInfo> userInfos = userInfoRepository.findViewInfo(); for(ViewInfo item : userInfos){ System.out.println(item.getUserInfo().getUserName()+" "+item.getAddress().getCity()); } System.out.println("=======left part======="); List<ViewInfo> userInfoLeft = userInfoRepository.findViewInfoLeft(); for(ViewInfo item : userInfoLeft){ System.out.println(item.getUserInfo().getUserName()+" "+item.getAddress().getCity()); } System.out.println("=======right part======="); List<ViewInfo> userInfoRight = addressRepository.findViewInfoRight(); for(ViewInfo item : userInfoRight){ System.out.println(item.getUserInfo().getUserName()+" "+item.getAddress().getCity()); } }
数据库的Inner Join选交集,Outer Join 选并集,Left Join 选左表与右表的差集加上交集,Right Join选右表与左表的差集加上交集。暂且如此了。若是哪位看到个人文章有更好的方法请不吝赐教。blog