美文网首页
golang xorm mysql代码生成器(java,go)

golang xorm mysql代码生成器(java,go)

作者: EasyNetCN | 来源:发表于2021-01-25 14:27 被阅读0次

    基于go,go template的数据层代码生成器,支持生成基于xorm go,spring jpa的数据层代码生成

    main.go

    package main
    
    import (
        "fmt"
        "io/ioutil"
        "os"
        "strings"
        "text/template"
        "unsafe"
    
        _ "github.com/go-sql-driver/mysql"
        "gopkg.in/yaml.v2"
        "xorm.io/xorm"
    )
    
    const (
        selectCurrentDbSql = "SELECT DATABASE()"
        allColumnInfoSql   = "SELECT * FROM information_schema.columns WHERE table_schema =? ORDER BY table_schema ASC,table_name ASC,ordinal_position ASC"
    )
    
    func main() {
        config, err := NewConfiguration()
    
        if err != nil {
            fmt.Println("can not read configuration file,err:", err)
    
            return
        }
        engine, err := xorm.NewEngine("mysql", config.Datasource)
    
        if err != nil {
            fmt.Println("can not create database engine,err:", err)
    
            return
        }
    
        currentDb := ""
    
        if _, err := engine.SQL(selectCurrentDbSql).Get(&currentDb); err != nil {
            fmt.Println("can not get current database,err:", err)
    
            return
        }
    
        columns := make([]DataColumn, 0)
    
        if err := engine.SQL(allColumnInfoSql, currentDb).Find(&columns); err != nil {
            fmt.Println("can not get column information,err:", err)
    
            return
        }
    
        tableMap := make(map[string][]DataColumn)
    
        for _, column := range columns {
            tableName := column.TableName
    
            if _, ok := tableMap[tableName]; !ok {
                tableMap[tableName] = make([]DataColumn, 0)
            }
    
            tableMap[tableName] = append(tableMap[tableName], column)
        }
    
        funcMap := template.FuncMap{"upperCamelCase": UpperCamelCase, "lowerCamelCase": LowerCamelCase}
    
        t, err := template.New(config.TplName).Funcs(funcMap).ParseFiles(config.TplFile)
    
        if err != nil {
            fmt.Println("parse file err:", err)
            return
        }
    
        os.RemoveAll(config.Output)
    
        for table, columns := range tableMap {
            if _, err := os.Stat(config.Output); os.IsNotExist(err) {
                os.Mkdir(config.Output, 0777)
                os.Chmod(config.Output, 0777)
            }
    
            fileSb := new(strings.Builder)
    
            fileSb.WriteString(config.Output)
            fileSb.WriteString("/")
    
            if config.Lang == "go" {
                fileSb.WriteString(table)
    
                if config.TargetType == "repository" {
                    fileSb.WriteString("_repository")
                }
            } else if config.Lang == "java" {
                if config.TargetType == "entity" {
                    fileSb.WriteString(UpperCamelCase(table))
                    fileSb.WriteString("Entity")
                } else if config.TargetType == "model" {
                    fileSb.WriteString(UpperCamelCase(table))
                } else if config.TargetType == "repository" {
                    fileSb.WriteString(UpperCamelCase(table))
                    fileSb.WriteString("EntityRepository")
                }
            }
    
            fileSb.WriteString(".")
            fileSb.WriteString(config.Lang)
    
            f, err := os.OpenFile(fileSb.String(), os.O_CREATE|os.O_WRONLY, 0666)
    
            defer f.Close()
    
            if err != nil {
                fmt.Println("can not create output file,err:", err)
    
                return
            }
    
            if err := t.Execute(f, &Config{TableName: table, Readonly: config.Readonly, PackageName: config.PackageName, Columns: columns}); err != nil {
                fmt.Println("There was an error:", err.Error())
            }
        }
    
    }
    
    type Configuration struct {
        Datasource  string            `yaml:"datasource"`
        Lang        string            `yaml:"lang"`
        TargetType  string            `yaml:"target-type"`
        TplName     string            `yaml:"tpl-name"`
        TplFile     string            `yaml:"tpl-file"`
        Readonly    bool              `yaml:"readonly"`
        Output      string            `yaml:"output"`
        SkipTables  []string          `yaml:"skip-tables"`
        SkipColumns []SkipColumn      `yaml:"skip-columns"`
        TypeMap     map[string]string `yaml:"type-map"`
        PackageName string            `yaml:"package-name"`
    }
    
    type SkipColumn struct {
        Table  string `yaml:"table"`
        Column string `yaml:"column"`
    }
    
    func NewConfiguration() (*Configuration, error) {
        conf := new(Configuration)
    
        data, err := ioutil.ReadFile("config.yml")
    
        if err != nil {
            return conf, err
        }
    
        err = yaml.Unmarshal(data, &conf)
    
        return conf, err
    }
    
    type Config struct {
        TableName   string
        Readonly    bool
        PackageName string
        Columns     []DataColumn
    }
    
    func (c *Config) PrimaryColumnDataType() string {
        for _, column := range c.Columns {
            if column.IsPrimary() {
                return column.JavaType()
            }
        }
    
        return ""
    }
    
    func (c *Config) HasDelStatus() bool {
        for _, column := range c.Columns {
            if column.IsDelStatus() {
                return true
            }
        }
    
        return false
    }
    
    func (c *Config) HasDecimalType() bool {
        for _, column := range c.Columns {
            if column.IsDecimalType() {
                return true
            }
        }
    
        return false
    }
    
    func (c *Config) HasDateType() bool {
        for _, column := range c.Columns {
            if column.IsDateType() {
                return true
            }
        }
    
        return false
    }
    
    func (c *Config) HasEnterpriseId() bool {
        return c.HasColumn("enterprise_id")
    }
    
    func (c *Config) HasCode() bool {
        return c.HasColumn("code")
    }
    
    func (c *Config) HasStatus() bool {
        return c.HasColumn("status")
    }
    
    func (c *Config) HasColumn(name string) bool {
        for _, column := range c.Columns {
            if column.ColumnName == name {
                return true
            }
        }
    
        return false
    }
    
    type DataColumn struct {
        TableSchema            string
        TableName              string
        ColumnName             string
        OrdinalPosition        int
        ColumnDefault          string
        IsNullable             string
        DataType               string
        CharacterMaximumLength string
        CharacterOctetLength   string
        NumericPrecision       string
        NumbericScale          string
        DatetimePrecision      string
        ColumnType             string
        ColumnKey              string
        Extra                  string
        ColumnComment          string
    }
    
    func (c *DataColumn) IsIdentity() bool {
        return strings.ToLower(c.Extra) == "auto_increment"
    }
    
    func (c *DataColumn) IsPrimary() bool {
        return strings.ToLower(c.ColumnKey) == "pri"
    }
    
    func (c *DataColumn) GoLangType() string {
        dataType := strings.ToLower(c.DataType)
        nullable := strings.ToLower(c.IsNullable) == "yes"
    
        if dataType == "int" {
            if nullable {
                return "*int"
            }
    
            return "int"
        }
    
        if dataType == "varchar" || dataType == "text" || dataType == "longtext" {
            if nullable {
                return "*string"
            }
    
            return "string"
        }
    
        if dataType == "long" || dataType == "bigint" {
            if nullable {
                return "*int64"
            }
    
            return "int64"
        }
    
        if dataType == "decimal" {
            if nullable {
                return "*float64"
            }
    
            return "ifloat64"
        }
    
        if dataType == "datetime" {
            if nullable {
                return "*core.LocalDateTime"
            }
    
            return "core.LocalDateTime"
        }
    
        return dataType
    }
    
    func (c *DataColumn) JavaType() string {
        dataType := strings.ToLower(c.DataType)
    
        if dataType == "int" {
            return "Integer"
        } else if dataType == "varchar" || dataType == "text" || dataType == "longtext" {
            return "String"
        } else if dataType == "long" || dataType == "bigint" {
            return "Long"
        } else if dataType == "decimal" {
            return "BigDecimal"
        } else if dataType == "datetime" {
            return "LocalDateTime"
        } else {
            return c.DataType
        }
    
    }
    
    func (c *DataColumn) IsDateType() bool {
        return strings.ToLower(c.DataType) == "datetime"
    }
    
    func (c *DataColumn) IsDecimalType() bool {
        return strings.ToLower(c.DataType) == "decimal"
    }
    
    func (c *DataColumn) IsDelStatus() bool {
        return c.ColumnName == "del_status"
    }
    
    func (c *DataColumn) Tag() string {
        name := strings.ToLower(c.ColumnName)
        dataType := strings.ToLower(c.DataType)
        identity := strings.ToLower(c.Extra) == "auto_increment"
        primary := strings.ToLower(c.ColumnKey) == "pri"
        nullable := strings.ToLower(c.IsNullable) == "yes"
    
        sb := new(strings.Builder)
    
        sb.WriteString("`xorm:\"")
        sb.WriteString(dataType)
        sb.WriteString(" '")
        sb.WriteString(name)
        sb.WriteString("'")
    
        if identity {
            sb.WriteString(" autoincr")
        }
    
        if primary {
            sb.WriteString(" pk")
        }
    
        if nullable {
            sb.WriteString(" null")
        } else {
            sb.WriteString(" notnull")
        }
    
        sb.WriteString(" default(")
    
        if dataType == "varchar" || dataType == "text" || dataType == "longtext" {
            sb.WriteString("'")
        }
    
        sb.WriteString(c.ColumnDefault)
    
        if dataType == "varchar" || dataType == "text" || dataType == "longtext" {
            sb.WriteString("'")
        }
    
        sb.WriteString(")")
    
        sb.WriteString(" comment('")
        sb.WriteString(c.ColumnComment)
        sb.WriteString("')")
    
        sb.WriteString("\" json:\"")
    
        if name == "del_status" {
            sb.WriteString("-")
        } else {
            sb.WriteString(LowerCamelCase(c.ColumnName))
        }
    
        sb.WriteString("\"`")
    
        return sb.String()
    }
    
    func UpperCamelCase(txt string) string {
        sb := new(strings.Builder)
    
        strs := strings.Split(txt, "_")
    
        for _, str := range strs {
            sb.WriteString(strings.ToUpper(string(str[0])))
            sb.WriteString(str[1:])
        }
    
        return sb.String()
    }
    
    func LowerCamelCase(txt string) string {
        sb := new(strings.Builder)
    
        strs := strings.Split(txt, "_")
    
        for i, str := range strs {
            if i == 0 {
                sb.WriteString(strings.ToLower(string(str[0])))
            } else {
                sb.WriteString(strings.ToUpper(string(str[0])))
            }
    
            sb.WriteString(str[1:])
        }
    
        return sb.String()
    }
    
    func BytesToString(b []byte) string {
        return *(*string)(unsafe.Pointer(&b))
    }
    
    

    config.yml

    datasource: ""
    lang: java
    target-type: repository
    tpl-name: repository.tpl
    tpl-file: tpl/java/repository.tpl
    readonly: false
    output: ""
    skip-tables:
    skip-columns:
    type-map:
    package-name: 
    

    go/model.tpl

    package model
    
    type {{upperCamelCase .TableName}} struct{
        {{- range $column := .Columns}}
        {{- if not .IsDelStatus}}
        // {{.ColumnComment}} 
        {{upperCamelCase .ColumnName}} {{.GoLangType}}
        {{- end -}}
        {{end}}
    }
    

    go/repository.tpl

    package repository
    
    type {{upperCamelCase .TableName}} struct{
        {{range $column := .Columns -}}
        {{upperCamelCase .ColumnName }} {{.GoLangType}} {{.Tag}} 
        {{end -}}
    }
    
    func (entity *{{upperCamelCase .TableName}}) Copy(target *{{upperCamelCase .TableName}},columns []string) ([]string,[]utility.BeanUpdateLogItem){
        updateColumns:=make([]string,0,len({{lowerCamelCase .TableName}}Columns))
        updateLogItems:=make([]utility.BeanUpdateLogItem,0,len({{lowerCamelCase .TableName}}Columns))
    
        columnMap := make(map[string]string)
    
        for _,column := range columns {
            columnMap[column]=column
        }
    
        {{range $column := .Columns -}}
        if _,ok:=columnMap["{{upperCamelCase .ColumnName}}"];!ok && entity.{{upperCamelCase .ColumnName}} != target.{{upperCamelCase .ColumnName}}{
             updateColumns = append(updateColumns,"{{.ColumnName}}")
             updateLogItems = append(updateLogItems,utility.BeanUpdateLogItem{PropertyName:"{{upperCamelCase .ColumnName}}",OldProperyValue:entity.{{upperCamelCase .ColumnName}},NewPropertyValue:target.{{upperCamelCase .ColumnName}}})
    
             target.{{upperCamelCase .ColumnName}} = entity.{{upperCamelCase .ColumnName}}
        }
        {{end -}}
    }
    
    {{if not .Readonly}}
        var(
            {{lowerCamelCase .TableName}}Columns=[]string{
                {{range $column := .Columns -}}
                "{{.ColumnName}}",
                {{end -}}
            }
            {{lowerCamelCase .TableName}}ColumnMap=map[string]string{
                {{range $column := .Columns -}}
                "{{.ColumnName }}":"{{.ColumnName}}",
                {{end -}}
            }
        )
    {{end}}
    type {{upperCamelCase .TableName}}Repository interface {
        {{- if not .Readonly}}
        Create(entity {{upperCamelCase .TableName}}) ({{upperCamelCase .TableName}}, error)
        {{- end -}}
        {{- if not .Readonly}}
        CreateBySession(session *xorm.Session, entity {{upperCamelCase .TableName}}) ({{upperCamelCase .TableName}}, error)
        {{- end -}}
        {{- if not .Readonly}}
        DeleteById(id int64) (int64, error)
        {{- end -}}
        {{- if not .Readonly}}
        DeleteBySessionAndId(session *xorm.Session, id int64) (int64, error)
        {{- end -}}
        {{- if not .Readonly}}
        Update(entity {{upperCamelCase .TableName}}, columns []string) ({{upperCamelCase .TableName}}, error)
        {{- end -}}
        {{- if not .Readonly}}
        UpdateBySession(session *xorm.Session, entity {{upperCamelCase .TableName}}, columns []string) ({{upperCamelCase .TableName}}, error)
        {{- end}}
        FindById(id int64) ({{upperCamelCase .TableName}}, error)
        FindBySessionAndId(session *xorm.Session, id int64) ({{upperCamelCase .TableName}}, error)
    }
    
    type {{lowerCamelCase .TableName}}Repository  struct {
        engine *xorm.Engine
    }
    
    func New{{upperCamelCase .TableName}}Repository(engine *xorm.Engine) {{upperCamelCase .TableName}}Repository {
        return &{{lowerCamelCase .TableName}}Repository{
            engine: engine,
        }
    }
    
    {{if not .Readonly}}
    func (r *{{lowerCamelCase .TableName}}Repository) Create(entity {{upperCamelCase .TableName}}) ({{upperCamelCase .TableName}}, error) {
        _, err := r.engine.Insert(&entity)
    
        return entity, err
    }
    {{end -}}
    
    {{if not .Readonly}}
    func (r *{{lowerCamelCase .TableName}}Repository) CreateBySession(session *xorm.Session, entity {{upperCamelCase .TableName}}) ({{upperCamelCase .TableName}}, error) {
        _, err := session.Insert(&entity)
    
        return entity, err
    }
    {{end -}}
    
    {{if not .Readonly}}
    func (r *{{lowerCamelCase .TableName}}Repository) DeleteById(id int64) (int64, error) {
        {{- if .HasDelStatus}}
        return r.engine.ID(id).Cols("del_status", "update_time").Update(&{{upperCamelCase .TableName}}{DelStatus: 1, UpdateTime: core.LocalDateTime(time.Now())})
        {{- else}}
        return r.engine.ID(id).Delete(&{{upperCamelCase .TableName}}{})
        {{- end}}
    }
    {{end -}}
    
    {{if not .Readonly}}
    func (r *{{lowerCamelCase .TableName}}Repository) DeleteBySessionAndId(session *xorm.Session, id int64) (int64, error) {
        {{- if .HasDelStatus}}
        return session.ID(id).Cols("del_status", "update_time").Update(&{{upperCamelCase .TableName}}{DelStatus: 1, UpdateTime: core.LocalDateTime(time.Now())})
        {{- else}}
        return session.ID(id).Delete(&{{upperCamelCase .TableName}}{})
        {{- end}}
    }
    {{end -}}
    
    {{if not .Readonly}}
    func (r *{{lowerCamelCase .TableName}}Repository) Update(entity {{upperCamelCase .TableName}},columns []string) ({{upperCamelCase .TableName}}, error) {
        _, err := r.engine.ID(entity.Id).Cols(columns...).Update(&entity)
    
        return entity, err
    }
    {{end -}}
    
    {{if not .Readonly}}
    func (r *{{lowerCamelCase .TableName}}Repository) UpdateBySession(session *xorm.Session, entity {{upperCamelCase .TableName}},columns []string) ({{upperCamelCase .TableName}}, error) {
        _, err := session.ID(entity.Id).Cols(columns...).Update(&entity)
    
        return entity, err
    }
    {{end}}
    
    func (r *{{lowerCamelCase .TableName}}Repository) FindById(id int64) ({{upperCamelCase .TableName}}, error) {
        entity := new({{upperCamelCase .TableName}})
    
        _, err := r.engine.ID(id){{if .HasDelStatus}}.Where("del_status=0"){{end}}.Get(entity)
    
        return *entity, err
    }
    
    func (r *{{lowerCamelCase .TableName}}Repository) FindBySessionAndId(session *xorm.Session, id int64) ({{upperCamelCase .TableName}}, error) {
        entity := new({{upperCamelCase .TableName}})
    
        _, err := session.ID(id){{if .HasDelStatus}}.Where("del_status=0"){{end}}.Get(entity)
    
        return *entity, err
    }
    

    java/entity.tpl

    package {{.PackageName}}.data.entity;
    
    import java.io.Serializable;
    {{- if .HasDecimalType}}
    import java.math.BigDecimal;
    {{- end -}}
    {{if .HasDateType}}
    import java.time.LocalDateTime;
    {{- end}}
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "{{.TableName}}")
    public class {{upperCamelCase .TableName}}Entity implements Serializable {
        private static final long serialVersionUID = 1L;
    
        {{- range $column := .Columns}}
    
        /*
         * {{.ColumnComment}}
         */
        {{if .IsPrimary -}}
        @Id
        {{- end -}}
        {{if .IsIdentity}}
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        {{- end -}}
        @Column(name = "{{.ColumnName}}")
        private {{.JavaType}} {{lowerCamelCase .ColumnName}};
        {{end}}
    
        {{- range $column := .Columns}}
        public {{.JavaType}} get{{upperCamelCase .ColumnName}}() {
            return {{lowerCamelCase .ColumnName}};
        }
    
        public void set{{upperCamelCase .ColumnName}}({{.JavaType}} {{lowerCamelCase .ColumnName}}) {
            this.{{lowerCamelCase .ColumnName}} = {{lowerCamelCase .ColumnName}};
        }
        {{end}}
    }
    

    java/model.tpl

    package {{.PackageName}}.model;
    {{if .HasDecimalType}}
    import java.math.BigDecimal;
    {{- end -}}
    {{if .HasDateType}}
    import java.time.LocalDateTime;
    {{- end}}
    
    @Entity
    @Table(name = "{{.TableName}}")
    public class {{upperCamelCase .TableName}} {
    
        {{- range $column := .Columns}}
    
        /*
         * {{.ColumnComment}}
         */
        private {{.JavaType}} {{lowerCamelCase .ColumnName}};
        {{- end}}
    
        {{range $column := .Columns}}
        public {{.JavaType}} get{{upperCamelCase .ColumnName}}() {
            return {{lowerCamelCase .ColumnName}};
        }
    
        public void set{{upperCamelCase .ColumnName}}({{.JavaType}} {{lowerCamelCase .ColumnName}}) {
            this.{{lowerCamelCase .ColumnName}} = {{lowerCamelCase .ColumnName}};
        }
        {{end}}
    }
    

    java/repository.tpl

    package {{.PackageName}}.data.repository;
    
    import java.time.LocalDateTime;
    import java.util.Collection;
    import java.util.List;
    import java.util.Optional;
    
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.domain.Slice;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
    import org.springframework.data.jpa.repository.Modifying;
    import org.springframework.data.jpa.repository.Query;
    import org.springframework.data.repository.query.Param;
    
    import {{.PackageName}}.entity.{{upperCamelCase .TableName}}Entity;
    
    public interface {{upperCamelCase .TableName}}EntityRepository
            extends JpaRepository<{{upperCamelCase .TableName}}Entity, {{.PrimaryColumnDataType}}>, JpaSpecificationExecutor<{{upperCamelCase .TableName}}Entity> {
        {{if .HasEnterpriseId}}
        @Query("select count(e.id) from #{#entityName} e where e.enterpriseId=0 or e.enterpriseId=:enterpriseId")   
        long countByEnterpriseId(@Param("enterpriseId")Long enterpriseId);
    
        @Query("select count(e.id) from #{#entityName} e where (e.enterpriseId=0 or e.enterpriseId=:enterpriseId) and e.updateTime>:updateTime")
        long countByEnterpriseIdAndUpdateTimeGreaterThan(@Param("enterpriseId")Long enterpriseId, @Param("updateTime")LocalDateTime updateTime);
    
        @Query("select e from #{#entityName} e where e.enterpriseId=0 or e.enterpriseId=:enterpriseId")
        List<{{upperCamelCase .TableName}}Entity> findByEnterpriseId(@Param("enterpriseId")Long enterpriseId);
    
        @Query("select e from #{#entityName} e where (e.enterpriseId=0 or e.enterpriseId=:enterpriseId) and e.id>:id")
        Slice<{{upperCamelCase .TableName}}Entity> findByEnterpriseIdAndIdGreaterThanOrderByIdAsc(@Param("enterpriseId")Long enterpriseId, @Param("id")Long id, Pageable pageable);
    
        @Query("select e from #{#entityName} e where (e.enterpriseId=0 or e.enterpriseId=:enterpriseId) and e.id>:id and e.updateTime>:updateTime")
        Slice<{{upperCamelCase .TableName}}Entity> findByEnterpriseIdAndIdGreaterThanAndUpdateTimeGreaterThanOrderByIdAsc(@Param("enterpriseId")Long enterpriseId,
                @Param("id")Long id, @Param("updateTime")LocalDateTime updateTime, Pageable pageable);
    
        long countByEnterpriseIdIn(Collection<Long> enterpriseIds);
    
        long countByEnterpriseIdInAndUpdateTimeGreaterThan(Collection<Long> enterpriseIds, LocalDateTime updateTime);
    
        List<{{upperCamelCase .TableName}}Entity> findByEnterpriseIdIn(Collection<Long> enterpriseIds);
    
        Slice<{{upperCamelCase .TableName}}Entity> findByEnterpriseIdInAndIdGreaterThanOrderByIdAsc(Collection<Long> enterpriseIds, Long id,
                Pageable pageable);
    
        Slice<{{upperCamelCase .TableName}}Entity> findByEnterpriseIdInAndIdGreaterThanAndUpdateTimeGreaterThanOrderByIdAsc(
                Collection<Long> enterpriseIds, Long id, LocalDateTime updateTime, Pageable pageable);
        {{if .HasCode}}
        
        boolean existsByEnterpriseIdAndCode(Long enterpriseId, String code);
        
        Optional<{{upperCamelCase .TableName}}Entity> findByEnterpriseIdAndCode(Long enterpriseId, String code);
        
        List<{{upperCamelCase .TableName}}Entity> findByEnterpriseIdAndCodeIn(Long enterpriseId, Collection<String> codes);
        
        List<{{upperCamelCase .TableName}}Entity> findByEnterpriseIdInAndCodeIn(Collection<Long> enterpriseIds, Collection<String> codes);
        {{if .HasDelStatus}}
        
        boolean existsByEnterpriseIdAndCodeAndDelStatus(Long enterpriseId, String code, Integer delStatus);
        
        Optional<{{upperCamelCase .TableName}}Entity> findByEnterpriseIdAndCodeAndDelStatus(Long enterpriseId, String code, Integer delStatus);
        
        List<{{upperCamelCase .TableName}}Entity> findByEnterpriseIdAndCodeInAndDelStatus(Long enterpriseId, Collection<String> codes, Integer delStatus);
        
        List<{{upperCamelCase .TableName}}Entity> findByEnterpriseIdInAndCodeInAndDelStatus(Collection<Long> enterpriseIds, Collection<String> codes, Integer delStatus);
        {{end}}
        {{- end -}}
        {{if .HasDelStatus}}
        @Query("select e from #{#entityName} e where e.delStatus=0")
        List<{{upperCamelCase .TableName}}Entity> findAvailable();
        
        @Query("select e from #{#entityName} e where e.id=:id and e.delStatus=0")
        Optional<{{upperCamelCase .TableName}}Entity> findAvailableById(@Param("id") Long id);
        
        @Query("select e from #{#entityName} e where e.id in (:ids) and e.delStatus=0")
        List<{{upperCamelCase .TableName}}Entity> findAvailableByIdIn(@Param("ids") Collection<Long> ids);
        
        @Query("select e from #{#entityName} e where (e.enterpriseId=0 or e.enterpriseId=:enterpriseId) and e.delStatus=0")
        List<{{upperCamelCase .TableName}}Entity> findAvailableByEnterpriseId(@Param("enterpriseId") Long enterpriseId);
    
        @Query("select e from #{#entityName} e where e.enterpriseId in (:enterpriseIds) and e.delStatus=0")
        List<{{upperCamelCase .TableName}}Entity> findAvailableByEnterpriseIdIn(@Param("enterpriseIds") Collection<Long> enterpriseIds);
        {{end -}}
        {{if .HasStatus}}
        @Modifying
        {{- if .HasDelStatus}}
        @Query("update #{#entityName} e set e.status=:status,e.updateTime=:updateTime where e.enterpriseId=:enterpriseId and e.delStatus=0")
        {{else -}}
        @Query("update #{#entityName} e set e.status=:status,e.updateTime=:updateTime where e.enterpriseId=:enterpriseId")
        {{- end -}}
        int updateStatusByEnterpriseId(@Param("enterpriseId") Long enterpriseId, @Param("status") Integer status,
                @Param("updateTime") LocalDateTime updateTime);
    
        @Modifying
        {{- if .HasDelStatus}}
        @Query("update #{#entityName} e set e.status=:status,e.updateTime=:updateTime where e.enterpriseId in (:enterpriseIds) and e.delStatus=0")
        {{else -}}
        @Query("update #{#entityName} e set e.status=:status,e.updateTime=:updateTime where e.enterpriseId in (:enterpriseIds)")
        {{- end -}}
        int updateStatusByEnterpriseIdIn(@Param("enterpriseIds") Collection<Long> enterpriseIds,
                @Param("status") Integer status, @Param("updateTime") LocalDateTime updateTime);
    
        @Modifying
        {{- if .HasDelStatus}}
        @Query("update #{#entityName} e set e.status=:status,e.updateTime=:updateTime where e.enterpriseId=:enterpriseId and e.id in (:ids) and e.delStatus=0")
        {{else -}}
        @Query("update #{#entityName} e set e.status=:status,e.updateTime=:updateTime where e.enterpriseId=:enterpriseId and e.id in (:ids)")
        {{- end -}}
        int updateStatusByEnterpriseIdAndIdIn(@Param("enterpriseId") Long enterpriseId, @Param("ids") Collection<Long> ids,
                @Param("status") Integer status, @Param("updateTime") LocalDateTime updateTime);
    
        @Modifying
        {{- if .HasDelStatus}}
        @Query("update #{#entityName} e set e.status=:status,e.updateTime=:updateTime where e.id in (:ids) and e.delStatus=0")
        {{else -}}
        @Query("update #{#entityName} e set e.status=:status,e.updateTime=:updateTime where e.id in (:ids)")
        {{- end -}}
        int updateStatusByIdIn(@Param("ids") Collection<Long> ids, @Param("status") Integer status,
                @Param("updateTime") LocalDateTime updateTime);
        {{end}}
        {{- if .HasDelStatus}}
        @Modifying
        @Query("update #{#entityName} e set e.delStatus=:delStatus,e.updateTime=:updateTime where e.enterpriseId=:enterpriseId and e.id=:id")
        int updateDelStatusByEnterpriseIdAndId(@Param("enterpriseId") Long enterpriseId,
                @Param("id") Long id, @Param("delStatus") Integer delStatus,
                @Param("updateTime") LocalDateTime updateTime);
        
        @Modifying      
        @Query("update #{#entityName} e set e.delStatus=:delStatus,e.updateTime=:updateTime where e.enterpriseId=:enterpriseId and e.id in (:ids)")
        int updateDelStatusByEnterpriseIdAndIdIn(@Param("enterpriseId") Long enterpriseId,
                @Param("ids") Collection<Long> ids, @Param("delStatus") Integer delStatus,
                @Param("updateTime") LocalDateTime updateTime);
                
        @Modifying
        @Query("update #{#entityName} e set e.delStatus=:delStatus,e.updateTime=:updateTime where e.id=:id")
        int updateDelStatusById(@Param("id") Long id, @Param("delStatus") Integer delStatus,
                @Param("updateTime") LocalDateTime updateTime);
    
        @Modifying
        @Query("update #{#entityName} e set e.delStatus=:delStatus,e.updateTime=:updateTime where e.id in (:ids)")
        int updateDelStatusByIdIn(@Param("ids") Collection<Long> ids, @Param("delStatus") Integer delStatus,
                @Param("updateTime") LocalDateTime updateTime);
        {{end}}
        {{- end}}
    }
    

    相关文章

      网友评论

          本文标题:golang xorm mysql代码生成器(java,go)

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