美文网首页
Spring Data JPA

Spring Data JPA

作者: 超薄智能 | 来源:发表于2016-12-30 12:48 被阅读190次

    An example(User) sequence


    UserRepository

    public interface UserRepository extends JpaRepository<User, String> {
        
        @Query("SELECT DISTINCT e2.name FROM User u, Employee e1, Employee e2 WHERE u.employeeId = e1.employeeId AND e1.managerId = e2.employeeId AND u.userId=:uid")
        ArrayList<String> findManagerNameByUID(@Param("uid") String uid);
        
        @Query("SELECT u FROM User u WHERE u.name=:un AND u.password=:pwd")
        User findUserByNamePwd(@Param("un") String uname, @Param("pwd") String pwd);
    }
    

    UserService

    public interface UserService {
        User findUser(String userId);
        User createUser(User user);
        User changeUser(User user);
        void removeUser(User user);
        
        ArrayList<String> findRoleNamesForUser(String userId);
        ArrayList<String> findManagerNameByUID(String userId);
        
        ArrayList<User> findAllUsers();
        ArrayList<Role> findRolesForUser(String userId);
        User authenticate(String uname, String pwd);
    }
    

    UserServiceImpl

    @Service
    public class UserServiceImpl implements UserService {
        
        @Resource
        private UserRepository userRepository;
    
        //JPA default method
        @Override
        @Transactional
        public ArrayList<User> findAllUsers() {
            ArrayList<User> ul = (ArrayList<User>) userRepository.findAll();
            return ul;
        }
        
        @Override
        @Transactional
        public User findUser(String userId) {
            return userRepository.findOne(userId);
    
        }
    
        @Override
        @Transactional
        public User createUser(User user) {
            return userRepository.saveAndFlush(user);
        }
    
        @Override
        @Transactional
        public User changeUser(User user) {
            return userRepository.saveAndFlush(user);
        }
    
        @Override
        @Transactional
        public void removeUser(User user) {
            userRepository.delete(user);
        }
        
        //new Query defined in userRepository 
        @Override
        @Transactional
        public ArrayList<String> findManagerNameByUID(String userId) {
            return userRepository.findManagerNameByUID(userId);
        }
        
        @Transactional
        public User authenticate(String uname, String pwd) {
            User u = userRepository.findUserByNamePwd(uname, pwd);
            return u;
        }
        
        //get the user model and use it's method 
        @Override
        @Transactional
        public ArrayList<Role> findRolesForUser(String userId) {
            return (ArrayList<Role>)userRepository.findOne(userId).getRoleSet();
        }
        
        @Override
        @Transactional
        public ArrayList<String> findRoleNamesForUser(String userId) {
            ArrayList<Role> rset =  (ArrayList<Role>) userRepository.findOne(userId).getRoleSet();
            ArrayList<String> rnames = new ArrayList<String>();
            for (Role role : rset) {
                rnames.add(role.getName());
            }
            return rnames;
        }
        
        @Override
        @Transactional
        public ArrayList<String> findRoleIdForUser(String userId) {
            ArrayList<String> getRoleIds =  (ArrayList<String>) userRepository.findOne(userId).getRoleIds();
            return getRoleIds;
        }
        
    }
    

    user model

    Entity
    @Table(name = "user")
    public class User {
        @Id
        @Column(name = "userid")
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private String userId;
        
        @NotNull
        @Temporal(TemporalType.DATE)
        @Column(name = "fromdate")
        @DateTimeFormat(pattern = "dd/MM/yyyy")
    
        @ManyToMany(targetEntity = Role.class, cascade = CascadeType.ALL, fetch=FetchType.EAGER)
        @JoinTable(name = "userrole", 
        joinColumns = {@JoinColumn(name = "userid", referencedColumnName = "userid") }, 
        inverseJoinColumns = {@JoinColumn(name = "roleid", referencedColumnName = "roleid") })
        private List<Role> roleSet;
        
        @Transient
        private ArrayList<String> roleIds = new ArrayList<String>();
        
        public List<Role> getRoleSet() {
            return roleSet;
        }
        public void setRoleSet(ArrayList<Role> roleSet) {
            this.roleSet = roleSet;
        }
    
        //just like predefined method for user
        public ArrayList<String> getRoleIds() {
            ArrayList<Role> rList = (ArrayList<Role>) this.getRoleSet();
            ArrayList<String> roleIds = new ArrayList<String>();
            for (Role role : rList) {
                roleIds.add(role.getRoleId());
            }
            return roleIds;
        }
        public void setRoleIds(ArrayList<String> roleIds) {
    
            this.roleIds = roleIds;
        }
    
    

    Repository @Query

        @Query("SELECT e FROM Employee e where e.employeeId = :id")
        Employee findEmployeeById(@Param("id") String id);
        
        @Query("SELECT e FROM Employee e where e.managerId = :mgrid")
        ArrayList<Employee> findEmployeesByManagerId(@Param("mgrid") String mgrid);
        
        @Query("SELECT DISTINCT m FROM Employee e, Employee m where e.managerId = m.employeeId ")
        ArrayList<Employee> findAllManagers();
    
        @Query("SELECT DISTINCT m.name FROM Employee e, Employee m where e.managerId = m.employeeId ")
        ArrayList<String> findAllManagerNames();
        
        @Query("SELECT DISTINCT e2 FROM Employee e1, Employee e2 WHERE e1.employeeId = e2.managerId AND e1.employeeId = :eid")
        ArrayList<Employee> findSubordinates(@Param("eid") String eid);
        
        @Query("SELECT DISTINCT e.employeeId FROM Employee e")
        ArrayList<String> findAllEmployeeIDs();
        User findUserByNamePwd(@Param("un") String uname, @Param("pwd") String pwd);
       
        @Query("SELECT c from Course c WHERE c.employeeId = :eid AND (c.status ='SUBMITTED' OR c.status ='UPDATED')")
        ArrayList<Course> findPendingCoursesByEID(@Param("eid") String eid);
        
        @Query(value = "SELECT * FROM course WHERE status = ?0", nativeQuery = true)
        ArrayList<Course> findPendingCoursesByStatus(String status);
    

    O/R Mapping Annotations

    one to one (Stock --|---|-- StockDetail)

    @Entity
    @Table(name = "stock")
    public class Stock implements java.io.Serializable {
        @Id
        @GeneratedValue(strategy = IDENTITY)
        @Column(name = "STOCK_ID", unique = true, nullable = false)
        private Integer stockId;
        
        @OneToOne(mappedBy = "stock")
        private StockDetail stockDetail;
    }
    
    @Entity
    @Table(name = "stock_detail")
    public class StockDetail implements java.io.Serializable {
        //...
        private Integer stockId;
        
        @OneToOne
        @PrimaryKeyJoinColumn
        private Stock stock;
    }
    

    one to many (Stock --|---<-- StockDailyRecord)

    @Entity
    @Table(name = "stock")
    public class Stock implements java.io.Serializable {
        //...
        private Integer stockId;
        
        @OneToMany(mappedBy = "stock")
        private Set<StockDailyRecord> stockDailyRecords;
    }
    
    @Entity
    @Table(name = "stock_detail")
    public class StockDetail implements java.io.Serializable {
        //...
        private Integer recordId;
        
        @ManyToOne
        @JoinColumn(name = "STOCK_ID")
        private Stock stock;
    }
    

    many to many (Stock -->---<-- Category)

    @Entity
    @Table(name = "stock")
    public class Stock implements java.io.Serializable {
        //...
        private Integer stockId;
        
        @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
        @JoinTable(name = "stock_category",
            joinColumns = {@JoinColumn(name = "STOCK_ID"},
            inverseJoinColumns = { @JoinColumn(name = "CATEGORY_ID"})
        private Set<Category> categories;
    }
    
    @Entity
    @Table(name = "category")
    public class Category implements java.io.Serializable {
        //...
        private Integer categoryId;
        
        @ManyToMany(fetch = FetchType.LAZY, mappedBy = "categories")
        private Set<Stock> stocks;
    }
    

    相关文章

      网友评论

          本文标题:Spring Data JPA

          本文链接:https://www.haomeiwen.com/subject/qijmvttx.html