Java 如何使用非静态方法泛型?
我想通过以下代码获取sql:Java 如何使用非静态方法泛型?,java,Java,我想通过以下代码获取sql: public class Mappers { public static class SqlBuilder { //SqlImpl class implements Sql, and select,from,method,alias,where return this. public static <T> SqlImpl<T> builder() { return new SqlImpl
public class Mappers {
public static class SqlBuilder {
//SqlImpl class implements Sql, and select,from,method,alias,where return this.
public static <T> SqlImpl<T> builder() {
return new SqlImpl<>();
}
}
}
,我不能在(A::getAId,B::getAId
)上使用,我得到错误:无法从静态上下文引用非静态方法
A::getAId
joinleftjoin(Sql)
tojoinleftjoin(Sql)代码>,完整源代码:
import javax.persistence.Table;
导入java.util.function.function;
接口连接{
//从a.col1=b.col2上的选项卡a左连接选项卡b中选择*
Join-leftJoin(Sql);
//从a.col1=b.col2上的选项卡a左连接选项卡b`中选择*选项`
//1.函数实现可序列化
//2.类别。getDeclaredMethod(“WriterReplace”)
//3.get字段名
Sql on(函数bf1、函数bf2);
}
接口构建函数{
R构建(T);
}
类SqlCondition{
公共SqlCondition和Quals(BuilderFunction f,字符串x){
归还这个;
}
}
接口Sql扩展联接{
//选择a、b、c。。。
Sql选择(BuilderFunction…t);
//从选项卡a到选项卡b
来自(t类)的Sql;
//从选项卡a中选择*
Sql别名(字符串名称);
//从选项卡a中选择*其中列=?
Sql-where(SqlCondition);
//获取sql
字符串build();
}
类SqlImpl实现Sql{
@凌驾
公共连接leftJoin(Sql){
返回null;
}
@凌驾
打开公共Sql(函数bf1、函数bf2){
返回null;
}
@凌驾
公共Sql选择(BuilderFunction…t){
返回null;
}
@凌驾
来自(t类)的公共Sql{
返回null;
}
@凌驾
公共Sql别名(字符串名称){
返回null;
}
@凌驾
公共Sql where(SqlCondition){
返回null;
}
@凌驾
公共字符串生成(){
返回null;
}
}
@表(name=“a_tab”)
甲级{
私人长期援助;
私有字符串名称;
公共字符串getName(){
返回名称;
}
公共长期援助{
返回援助;
}
//吸气剂设定器
}
@表(name=“b_选项卡”)
B类{
私人长期投标;
私人长期援助;
公共长期援助{
返回援助;
}
公众长期投标(){
退还投标书;
}
//吸气剂设定器
}
公共类映射器{
公共静态类SqlBuilder{
//SqlImpl类实现Sql,并选择、from、method、alias,其中返回此值。
公共静态SqlImpl生成器(){
返回新的SqlImpl();
}
}
公共静态void main(字符串[]args){
Mappers.SqlBuilder.builder()
.选择(A::getAId,A::getName)
.来自(A类)
.where(新的SqlCondition().andEquals(A::getName,“x”))
.leftJoin(Mappers.SqlBuilder.builder()
.选择(B::getAId,B::getBId)
.来自(B级)
.别名(“b_标签”)
)
.on(A::getAId,B::getAId);//错误:无法从静态上下文“”引用非静态方法。
}
}
修改joinleftjoin(Sql)
tojoinleftjoin(Sql)代码>,完整源代码:
import javax.persistence.Table;
导入java.util.function.function;
接口连接{
//从a.col1=b.col2上的选项卡a左连接选项卡b中选择*
Join-leftJoin(Sql);
//从a.col1=b.col2上的选项卡a左连接选项卡b`中选择*选项`
//1.函数实现可序列化
//2.类别。getDeclaredMethod(“WriterReplace”)
//3.get字段名
Sql on(函数bf1、函数bf2);
}
接口构建函数{
R构建(T);
}
类SqlCondition{
公共SqlCondition和Quals(BuilderFunction f,字符串x){
归还这个;
}
}
接口Sql扩展联接{
//选择a、b、c。。。
Sql选择(BuilderFunction…t);
//从选项卡a到选项卡b
来自(t类)的Sql;
//从选项卡a中选择*
Sql别名(字符串名称);
//从选项卡a中选择*其中列=?
Sql-where(SqlCondition);
//获取sql
字符串build();
}
类SqlImpl实现Sql{
@凌驾
公共连接leftJoin(Sql){
返回null;
}
@凌驾
打开公共Sql(函数bf1、函数bf2){
返回null;
}
@凌驾
公共Sql选择(BuilderFunction…t){
返回null;
}
@凌驾
来自(t类)的公共Sql{
返回null;
}
@凌驾
公共Sql别名(字符串名称){
返回null;
}
@凌驾
公共Sql where(SqlCondition){
返回null;
}
@凌驾
公共字符串生成(){
返回null;
}
}
@表(name=“a_tab”)
甲级{
私人长期援助;
私有字符串名称;
公共字符串getName(){
返回名称;
}
公共长期援助{
返回援助;
}
//吸气剂设定器
}
@表(name=“b_选项卡”)
B类{
私人长期投标;
私人长期援助;
公共长期援助{
返回援助;
}
公众长期投标(){
退还投标书;
}
//吸气剂设定器
}
公共类映射器{
公共静态类SqlBuilder{
//SqlImpl类实现Sql,并选择、from、method、alias,其中返回此值。
公共静态SqlImpl生成器(){
返回新的SqlImpl();
}
}
公共静态void main(字符串[]args){
Mappers.SqlBuilder.builder()
.选择(A::getAId,A::getName)
.来自(A类)
.where(新的SqlCondition().andEquals(A::getName,“x”))
.leftJoin(Mappers.SqlBuilder.builder()
.选择(B::getAId,B::getBId)
.来自(B级)
.别名(“b_标签”)
)
.on(A::getAId,B::getAId);//错误:无法从静态上下文“”引用非静态方法。
}
}
请添加co
public interface Join<T> {
//select * from tab_a a left join tab_b b on a.col1 = b.col2
Join<T> leftJoin(Sql<T> Sql);
//select * from tab_a a left join tab_b b `on a.col1 = b.col2`
// 1.Function implements Serializable
// 2.class.getDeclaredMethod("writeReplace")
// 3.get field name
<T1,T2> Sql<T> on(Function<T1,Object> bf1,Function<T2,Object> bf2)
}
public interface Sql<T> extends Join<T> {
// select a,b,c ...
Sql<T> select(BuilderFunction<T, Object>... t);
// from tab_a,tab_b
Sql<T> from(Class<T> t);
// select * from tab_a a
Sql<T> alias(String name);
//select * from tab_a where col = ?
Sql<T> where(SqlCondition condition);
// get sql
String build();
}
Mappers.SqlBuilder.<A>builder()
.select(A::getAId,A::getName)
.from(A.class)
.where(new SqlCondition().andEquals(A::getName,"x"))
.leftJoin(Mappers.SqlBuilder.<B>builder()
.select(B::getAId,B::getBId)
.from(B.class)
.alias("b_tab")
)
.on(A::getAId,B::getAId); // error: Non-static method cannot be referenced from a static context`.
@Table(name="a_tab")
class A {
private Long aId;
private String name;
//getter setter
}
@Table(name="b_tab")
class B {
private Long bId;
private Long aId;
//getter setter
}