Spring Data JPA

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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容