目前我正在使用以下代码在 jpa 中进行一些过滤:
if (value.getClass() == Integer.class) {
return cb.greaterThan(root.<Integer>get(field), (Integer) value);
} else if (value.getClass() == Long.class) {
return cb.greaterThan(root.<Long>get(field), (Long) value);
} else if (value.getClass() == Float.class) {
return cb.greaterThan(root.<Float>get(field), (Float) value);
} else if (value.getClass() == Date.class) {
return cb.greaterThan(root.<Date>get(field), (Date) value);
}
我怎样才能将这个 block 减少到这样的一行?
return cb.greaterThan(root.<value.getClass()>get(field), value);
所以我需要用我的类类型替换 < t=""> 中的 T 值。可悲的是,我在 Java 泛型方面不是那么好。有人有想法吗?有可能吗?
root 属于以下类型:http://docs.oracle.com/javaee/6/api/javax/persistence/criteria/Path.html#get%28java.lang.String%29
编辑:这是我要写的完整类(class):
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
public class FilterExpression {
public static final Integer BEGINS_WITH = 0;
public static final Integer ENDS_WITH = 1;
public static final Integer CONTAINS = 2;
public static final Integer EQUAL = 3;
public static final Integer NOT_EQUAL = 4;
public static final Integer GREATER_THAN = 5;
public static final Integer GREATER_EQUAL_THAN = 6;
public static final Integer LESS_THAN = 7;
public static final Integer LESS_EQUAL_THAN = 8;
private static final Map<String, Integer> OPERATOR_MAPPING;
static {
Map<String, Integer> temp = new HashMap<>();
temp.put("bw", BEGINS_WITH);
temp.put("ew", ENDS_WITH);
temp.put("ct", CONTAINS);
temp.put("eq", EQUAL);
temp.put("nq", NOT_EQUAL);
temp.put("gt", GREATER_THAN);
temp.put("gq", GREATER_EQUAL_THAN);
temp.put("lt", LESS_THAN);
temp.put("lq", LESS_EQUAL_THAN);
OPERATOR_MAPPING = Collections.unmodifiableMap(temp);
}
private String field;
private Integer operator;
private Object value;
public FilterExpression(String field, String operator, String value, Class c) {
this.field = field;
setOperator(operator);
setValue(value, c);
}
public Boolean validate() {
if (StringUtils.isEmpty(field) || operator == null || value == null) {
return false;
}
Class c = value.getClass();
if (c == String.class) {
return operator >= BEGINS_WITH && operator <= NOT_EQUAL;
} else if (c == Integer.class || c == Float.class || c == Double.class) {
return (EQUAL >= EQUAL && operator <= LESS_EQUAL_THAN);
} else if (c == Boolean.class) {
return operator == EQUAL || operator == NOT_EQUAL;
} else if (c == Identification.Type.class) {
return operator == EQUAL || operator == NOT_EQUAL;
}
return false;
}
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
public Integer getOperator() {
return operator;
}
public void setOperator(String operator) {
this.operator = OPERATOR_MAPPING.get(operator.toLowerCase());
}
public Object getValue() {
return value;
}
public void setValue(String s, Class c) {
try {
if (Boolean.class == c) {
this.value = validateBoolean(s);
} else if (Integer.class == c) {
this.value = Integer.parseInt(s);
} else if (Float.class == c) {
this.value = Float.parseFloat(s);
} else if (Identification.Type.class == c) {
this.value = Identification.Type.parse(Integer.parseInt(s));
} else {
this.value = s;
}
} catch (NumberFormatException ex) {
this.value = null;
}
}
public <R> Predicate toPredicate(CriteriaBuilder cb, Root<R> root) {
if (Objects.equals(operator, FilterExpression.EQUAL)) {
return cb.equal(root.get(field), value);
} else if (Objects.equals(operator, FilterExpression.NOT_EQUAL)) {
return cb.notEqual(root.get(field), value);
} else if (Objects.equals(operator, FilterExpression.CONTAINS)) {
return cb.like(root.<String>get(field), "%" + value + "%");
} else if (Objects.equals(operator, FilterExpression.ENDS_WITH)) {
return cb.like(root.<String>get(field), "%" + value);
} else if (Objects.equals(operator, FilterExpression.BEGINS_WITH)) {
return cb.like(root.<String>get(field), value + "%");
} else if (Objects.equals(operator, FilterExpression.GREATER_THAN)) {
if (value.getClass() == Integer.class) {
return cb.greaterThan(root.<Integer>get(field), (Integer) value);
} else if (value.getClass() == Float.class) {
return cb.greaterThan(root.<Float>get(field), (Float) value);
} else if (value.getClass() == Date.class) {
return cb.greaterThan(root.<Date>get(field), (Date) value);
}
} else if (Objects.equals(operator, FilterExpression.GREATER_EQUAL_THAN)) {
if (value.getClass() == Integer.class) {
return cb.greaterThanOrEqualTo(root.<Integer>get(field), (Integer) value);
} else if (value.getClass() == Float.class) {
return cb.greaterThanOrEqualTo(root.<Float>get(field), (Float) value);
} else if (value.getClass() == Date.class) {
return cb.greaterThanOrEqualTo(root.<Date>get(field), (Date) value);
}
} else if (Objects.equals(operator, FilterExpression.LESS_THAN)) {
if (value.getClass() == Integer.class) {
return cb.lessThan(root.<Integer>get(field), (Integer) value);
} else if (value.getClass() == Float.class) {
return cb.lessThan(root.<Float>get(field), (Float) value);
} else if (value.getClass() == Date.class) {
return cb.lessThan(root.<Date>get(field), (Date) value);
}
} else if (Objects.equals(operator, FilterExpression.LESS_EQUAL_THAN)) {
if (value.getClass() == Integer.class) {
return cb.lessThanOrEqualTo(root.<Integer>get(field), (Integer) value);
} else if (value.getClass() == Float.class) {
return cb.lessThanOrEqualTo(root.<Float>get(field), (Float) value);
} else if (value.getClass() == Date.class) {
return cb.lessThanOrEqualTo(root.<Date>get(field), (Date) value);
}
}
return null;
}
最佳答案
我猜你可以让整个类通用。
public class FilterExpression<T extends Comparable<T>> {
//Make value to be type T instead of Object.
T value;
// And you could easily do,
...
return cb.greaterThan(root.<T>get(field), value);
}
关于Java 泛型变量 <T> 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39000071/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我